在我们进入下一个主题之前,我们先插入一个关于"科学计数法"的话题。
科学计数法是一种将冗长数字简洁表示的有用简写方式。虽然科学计数法一开始看起来有些陌生,但理解它将有助于你理解浮点数是如何运作的——更重要的是,它的局限性是什么。
科学计数法中的数字形式如下:有效数 × 10^指数。例如,在科学计数法 1.2 × 10⁴
中,1.2
是有效数,4
是指数。由于 10⁴ = 10,000
,所以 1.2 × 10⁴ = 12,000
。
按惯例,科学计数法中的数字会写成小数点前只有一位数字,其余数字在小数点之后。
比如地球的质量,用十进制表示是:
5972200000000000000000000 kg
这个数字非常大(大到一个 8 字节整数都装不下)。同时也很难阅读(这是 19 个零还是 20 个零?)。即使加了分隔符(如 5,972,200,000,000,000,000,000,000
),还是不太容易读。
而使用科学计数法,则可表示为:
5.9722 × 10²⁴ kg
这样要清晰得多。科学计数法的另一个好处是:在比较极大或极小的两个数时,可以直接比较指数的大小,非常直观。
由于在 C++ 中输入或显示指数比较麻烦,我们通常使用字母 e
(有时是 E
)来代表"乘以 10 的多少次幂"。比如:
1.2 × 10⁴ → 1.2e4
5.9722 × 10²⁴ → 5.9722e24
如果是小于 1 的数字,指数可以为负数。例如:
5e-2 = 5 × 10⁻² = 5 ÷ 10² = 0.05
电子的质量就是:
9.1093837e-31 kg
Linux用户注意事项
如果你在使用 Arch Linux 时发现 5 × 10⁻²
中的负号丢失了,可能是因为系统字体无法显示这些字符。你可以安装支持的字体,详情可参考 Reddit 这个帖子
有效数字详解
假设你忘记了 π(圆周率)是多少,于是你问了两个人。一人告诉你 π ≈ 3.14,另一人告诉你 π ≈ 3.14159。这两个答案都是"正确"的,但后者显然更加精确。
重点在于:科学计数法中,有效数(小数点前的部分)里的数字称为"有效数字"(significant digits)。有效数字越多,表示越精确。
关键概念
有效数中的数字越多,表示的数值越精确。
在科学计数法中,我们将 3.14
表示为:
3.14e0
因为有效数中有 3 个数字,所以是 3 位有效数字。
3.14159
则为:
3.14159e0
共 6 位有效数字。
十进制转科学计数法的完整指南
转换步骤如下:
- 指数初始为 0。
- 如果原数没有小数点(如 123),默认小数点在右侧:123 → 123.
- 将小数点左移或右移,使得小数点左边只有一位非零数字。
- 每向左移一位,小数指数 +1;每向右移一位,指数 -1。
- 去除有效数左端多余的零。
- 若原数没有小数点,可以去掉右侧尾随零(假设它们不具有效意义);如果你已知它们具有意义,则保留。
转换示例
示例 1:
原数:600.410
左移 2 位:6.00410e2
无须处理前导零:6.00410e2
保留尾部零:6.00410e2
(6 位有效数字)
示例 2:
原数:0.0078900
右移 3 位:0007.8900e-3
去掉前导零:7.8900e-3
保留尾部零:7.8900e-3
(5 位有效数字)
示例 3:
原数:42030
(假设尾部零不具有意义)
左移 4 位:4.2030e4
保留前导数字:4.2030e4
去掉尾部零:4.203e4
(4 位有效数字)
示例 4:
原数:42030
(假设尾部零具有意义)
左移 4 位:4.2030e4
保留尾部零:4.2030e4
(5 位有效数字)
尾部零的处理方法
想象我们请两位实验助理分别称量同一个苹果的质量:
- 第一位报告:87.0 克
- 第二位报告:87.000 克
假设称量都是准确的:
- 前者可能表示精确到小数点后一位,即真实值在
86.950 ~ 87.049
之间。 - 后者则更加精确,真实值在
86.99950 ~ 87.00049
之间。
科学计数法的转换规则
87.0g
→8.70e1
(3 位有效数字)87.000g
→8.7000e1
(5 位有效数字)
对于没有小数点的数字,默认尾部零不具有效意义:
2100
→2.1e3
(假设尾零不具有效意义)
如果你已知该数字非常精确:
2100
→2.100e3
(尾零具有效意义)
特殊表示法
你有时会看到一个数字带有明确的尾部小数点,如:
2100.
这表示尾部零是有意义的,对应:
2100. = 2.100e3
科学计数法的一个优点就是:它总能清晰表达出一个数中有多少有效数字。
从技术角度看,87.0 和 87.000 具有相同的数值和数据类型。C++ 在内存中仅存储数值本身(如 87),无法记录你原始输入的是哪个。
实践练习:科学计数法转换
练习题
将以下数字转换为科学计数法(用 e
表示指数),并标出它们各有多少位有效数字:
(提示:保留小数点后的尾零;若没有小数点,则默认尾零不具有效意义)
a)34.50
b)0.004000
c)123.005
d)146000
e)146000.001
f)0.0000000008
g)34500.0
h)146000(假设你知道尾部零具有效意义)