Skip to content

4.7 - 科学计数法

在谈论下一个话题之前,我们先来讨论一下科学计数法。

科学计数法是一种将大数表示为精简格式的非常有用的方法。尽管科学计数法第一眼看上去会有些陌生,理解科学计数法可以帮助我们理解浮点数的工作原理及其限制。

科学计数法的表示形式为:\(有效数字 * 10^{指数}\)。例如 1.2 x 10⁴中,1.2 是有效数字而4是指数。因为10的四次方等于10,000,所以 1.2 x 10⁴等于12,000。

按照惯例,科学计数法的有效数字部分,小数点前写一个非零数字,其他非零数字则写到小数点后。

例如,以十进制表示法表示地球的质量时,我们会写成5973600000000000000000000 kg。好长一串数字!(而且大到不能被8字节整型所表示)。同时,读起来也很困难(到底是19个0还是20个0?)。即便以逗号来分割成 5,973,600,000,000,000,000,000,000,看上去仍然非常吃力。

如果用科学计数法表示,则可以写作 5.9736 x 10²⁴ kg,看上去就非常简洁了。除此之外,科学计数法还有利于对两个非常大或非常小的值比较其数量级,因为只需要比较指数部分即可。

因为在C++中,输入和显示指数记号会比较困难,所以我们使用字母e(有时也使用大写字母E)来表示10的次方。例如 1.2 x 10⁴ 会写作 1.2e4,而 5.9736 x 10²⁴ 则写作 5.9736e24

对于小于1的数,指数部分则是负数,例如 5e-2 等价于 5 * 10⁻²,即 5 / 10² 或 0.05。电子的质量可以表示为 9.1093822e-31 kg

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

使用下面步骤:

  • 指数部分从0开始。
  • 移动小数点,使其左边只有一位数。
    • 每次向左移动,指数+1
    • 每次向右移动,指数-1
  • 删除有效数字左边的0
  • 如果原数字没有小数部分,删除有效数字末尾的0,如果没有特别指明,我们认为这些0没有意义。

一些例子:

1
2
3
4
起始值: 42030
小数点左移4位:4.2030e4
有效数字左侧没有需要删除的0:4.2030e4
删除有效数字末尾的0:4.203e4 (4 位有效数字)
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 位有效数字)

重点理解:有效数字部分的位数 (‘e’前面的部分) 称为有效数字。有效数字决定了这个数的精度,有效数字位数越多说明精度越高。

精度以及小数点后的0

想象一下,如果我们就同一个苹果的重量询问两个实验室助手,一个回答苹果重为87克,另一个回答为87.00克,假设它们的结果都是对的,对于前一个回答来说,苹果的真实重量可能位于86.50 和 87.49 克之间。也许他使用的天平精度只到克,也许是他进行了四舍五入。而对于后一种情况,我们可以对其精度更加自信(重量在 86.9950 和 87.0049 克之间,变化区间更小了)。

所以,在标准的科学计数法中,我们倾向于保留小数点后面尾部的0,因为这些0可以有效地表明该数值的精度。

不过,在C++中,87 和 87.000 并没有任何区别,编译器存储两数的结果也是完全一样的。从技术上讲,使用两种写法没有任何区别(当然,如果你使用的是代码即文档的表示方式,也许会有出于科学上的理由)。

介绍完科学计数法,我们可以开始介绍浮点数了。