科学计数法完全指南:C++中的数值表示方法

在我们进入下一个主题之前,我们先插入一个关于"科学计数法"的话题。

科学计数法是一种将冗长数字简洁表示的有用简写方式。虽然科学计数法一开始看起来有些陌生,但理解它将有助于你理解浮点数是如何运作的——更重要的是,它的局限性是什么。

科学计数法中的数字形式如下:有效数 × 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 位有效数字。

十进制转科学计数法的完整指南

转换步骤如下:

  1. 指数初始为 0。
  2. 如果原数没有小数点(如 123),默认小数点在右侧:123 → 123.
  3. 将小数点左移或右移,使得小数点左边只有一位非零数字。
  4. 每向左移一位,小数指数 +1;每向右移一位,指数 -1。
  5. 去除有效数左端多余的零。
  6. 若原数没有小数点,可以去掉右侧尾随零(假设它们不具有效意义);如果你已知它们具有意义,则保留。

转换示例

示例 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.0g8.70e1(3 位有效数字)
  • 87.000g8.7000e1(5 位有效数字)

对于没有小数点的数字,默认尾部零不具有效意义:

  • 21002.1e3(假设尾零不具有效意义)

如果你已知该数字非常精确:

  • 21002.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(假设你知道尾部零具有效意义)


关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"