章节目录

科学记数法

本节阅读量:

在讨论下一个主题之前,我们先简单了解一下科学记数法。

科学记数法是一种以简洁方式书写冗长数字的速记方法。尽管科学记数法乍看可能有些陌生,但理解它将有助于您掌握浮点数的工作原理及其局限性。

科学记数法中的数字采用以下形式:有效位 x 10的指数次方。例如,在科学记数法1.2 x 10^4中,1.2是有效位,4是指数。10^4等于10000,所以1.2 x 10^4等于12000。

按照惯例,科学记数法中的数字在小数点前只写一位数字,其余数字写在小数点后。

考虑地球的质量。用十进制表示,需要写成5973600000000000000000000kg。这是一个非常大的数字(即使用8字节的整数也放不下)。而且很难阅读(到底是19个零还是20个零?)。即使加上分隔符(5,973,600,000,000,000,000,000,000),该数字仍然很难读。

用科学记数法表示,则写成5.9736 x 10^24 kg。科学记数法的另一个好处是,通过比较指数,可以更方便地比较两个非常大或非常小的数字的大小。

因为在C++中很难键入或显示指数,所以我们使用字母”e”来表示”10的幂次方”部分。例如,1.2 x 10^4 写为1.2e4,而5.9736 x 10^24 写为5.9736e24。

对于小于1的数字,指数可以为负数。数字5e-2相当于5*10^-2,即5/100或0.05。电子的质量为9.1093822e-31 kg。


如何将数字转换为科学记数法

使用以下步骤:

  • 指数从零开始。
  • 滑动小数点,使小数点左侧只有一个非零数字。
    • 向左滑动一位,指数加一
    • 向右滑动一位,指数减一
  • 删去任何前导零(在有效位的左端)
  • 尾部的0如果是有效的,则不能删除

下面是一些示例:

1
2
3
4
开始: 0.0078900
小数点右滑3: 0007.8900e-3
删除前导0: 7.8900e-3
保留尾部的0: 7.8900e-3 (5 个有效位)
1
2
3
4
开始: 600.410
小数点左滑2: 6.00410e2
无前导0: 6.00410e2
保留尾部的0: 6.00410e2 (6 个有效位)
1
2
3
4
开始: 42030 (尾部0无效的情况)
小数点左滑4: 4.2030e4
无前导0: 4.2030e4
删除尾部的0: 4.203e4 (4 个有效位)
1
2
3
4
开始: 42030 (尾部0有效的情况)
小数点左滑4: 4.2030e4
无前导0: 4.2030e4
保留尾部的0: 4.2030e4 (5 significant digits)

下面是最重要的一点:有效位中的数字(”e”之前的部分)称为有效数字。有效数字的个数决定了数字的精度。有效位中包含的数字越多,数字就越精确。


精度和小数点后的尾随零

考虑这样一种情况:我们让两个实验室助理分别称量同一个苹果。一个人回来说苹果重87.0克,另一个回来说苹果重87.000克。假设称重结果都是正确的。在前一种情况下,苹果的实际重量可能在86.950克到87.049克之间,天平的精度只有十分之一克。在后一种情况下,我们对苹果实际重量的把握更大(重量在86.99950到87.00049克之间,变化范围小得多)。

因此在标准科学记数法中,我们倾向于保留小数点后的尾随零,因为这些数字传达了关于精度的有用信息。

  • 87.0g = 8.70e1
  • 87.000g = 8.7000e1

然而从技术角度来看,数字87.0和87.000具有相同的值(和相同的类型)。当C++将这两个数字存储在内存中时,只会存储值87。一旦存储完成,就无法从存储的值中分辨出最初使用的是哪一个。


4.5 固定宽度整数和size_t

上一节

4.7 浮点数

下一节