4-7 科学记数法介绍

在进入下一个主题之前,我们先插入一个关于科学记数的讨论。

科学记数法Scientific notation是一种将长数字简洁书写的实用缩写方式。虽然初次接触时可能显得陌生,但理解科学记数法将帮助你掌握浮点数的运作原理,更重要的是认识其局限性。

科学记数法的数字形式如下:有效数字significand × 10指数exponent。例如,在科学记数法1.2×10⁴中,1.2是有效数字,4是指数。由于10⁴等于10,000,因此1.2×10⁴等于12,000。

按惯例,科学记数法中的数字在小数点前保留一位,其余位数置于小数点后。

以地球质量为例。十进制表示法下需书写为 5972200000000000000000000 千克。这不仅是超大数值(甚至超出8字节整数的存储范围),更存在可读性问题(后面的零究竟是19个还是20个?)。即使添加分隔符(5,972,200,000,000,000,000,000,000)仍不易辨识。

采用科学记数法则可表示为5.9722 × 10²⁴千克,可读性显著提升。科学记数法的额外优势在于:通过比较指数即可轻松比较两个极大或极小数值的量级。

由于在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千克。

Linux用户须知
若您使用Arch Linux系统时发现5 * 10⁻²的上标缺少负号,可能需要安装支持显示此类字符的字体。更多信息请参阅此Reddit讨论帖


有效数字

假设你需要知道数学常数π在某个方程中的值,但你忘记了。你询问了两个人。一人告诉你π的值是3.14,另一人则说π的值是3.14159。这两个值都是“正确的”,但后者显然更为精确。

理解科学记数法最关键的是:有效数值(即小数点后e前的部分)中的数字称为有效数字significant digits(或有效位数significant figures)。有效数字越多,数值就越精确。

关键要点
有效数字位数越多,数值精度越高。The more digits in the significand, the more precise a number is.

在科学记数法中,我们将3.14写为3.14e0。由于有效数字位数为3,因此该数有3个有效数字。

3.14159则写为3.14159e0。由于有效数字位数为6,因此该数有6个有效数字。


如何将十进制数转换为科学记数法

请按以下步骤操作:

  • 指数从零开始计数。
  • 若数字未明确标注小数点(如123),则默认小数点位于右端(如123.)。
  • 将小数点左右移动,使小数点左侧仅保留一位非零数字。
    • 小数点每向左移动一位,指数增加1。
    • 小数点每向右移动一位,指数减少1。
  • 截除所有前导零(位于有效数字左端)
  • 仅当原始数无小数点时,才截除所有尾随零(位于有效数字右端)。我们假设这些零不具意义。若您有额外信息表明它们具有意义,可保留。

以下是示例:

Start with: 600.410
Slide decimal point left 2 spaces: 6.00410e2
No leading zeros to trim: 6.00410e2
Don't trim trailing zeros: 6.00410e2 (6 significant digits)
Start with: 0.0078900
Slide decimal point right 3 spaces: 0007.8900e-3
Trim leading zeros: 7.8900e-3
Don't trim trailing zeros: 7.8900e-3 (5 significant digits)
Start with: 42030 (no information to suggest the trailing zero is significant)
Slide decimal point left 4 spaces: 4.2030e4
No leading zeros to trim: 4.2030e4
Trim trailing zeros: 4.203e4 (4 significant digits)
Start with: 42030 (assuming the trailing zero is significant)
Slide decimal point left 4 spaces: 4.2030e4
No leading zeros to trim: 4.2030e4
Keep trailing zeros: 4.2030e4 (5 significant digits)

处理尾随零的问题

假设我们让两名实验室助理分别称量同一颗苹果。一人称重后报告苹果重87.0克,另一人则称重后报告苹果重87.000克。假设称重结果准确无误。在前一种情况下,苹果的实际重量可能落在86.950克至87.049克之间。可能是秤的精度仅到十分之一克,也可能是助理进行了四舍五入。后一种情况让我们对苹果实际重量的把握更为精准(其真实重量介于86.99950至87.00049克之间,变动范围更小)。

转换为科学记数法时,小数点后的尾随零被视为有效数字,因此需保留:

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

对于无小数点的数值,尾随零默认视为非有效数字。以数字2100为例(无额外信息),我们假定尾随零不具意义,故予以舍弃:

  • 2100 = 2.1e3 (尾随零视为非有效数字)

但若已知该数值为精密测量结果(或实际值介于2099.5至2100.5之间),则应将尾随零视为有效数字:

  • 2100 = 2.100e3(尾随零为已知有效数字)

提示

有时会看到数字后明确标注小数点。这表明前导零具有有效性。

    1. = 2.100e3(后导零已知有效)

科学记数法的优点在于始终明确有效位数。

从技术角度看,数字 87.0 和 87.000 具有相同数值(及相同类型)。当 C++ 将任一数字存储至内存时,实际存储的仅是数值 87。一旦存储,便无法从存储值判断原始输入的具体数字。

在掌握科学记数法后,我们即可进入浮点数的学习。


测验时间

问题 #1

将下列数字转换为科学记数法(用 e 表示指数),并确定每个数字有多少个有效数字位。

注意:小数点后保留尾随零,若无小数点则舍去尾随零。

a) 34.50

显示解答

3.450e1 (4 significant digits保留4位有效数字)

b) 0.004000

显示解答

4.000e-3 (4 significant digits)

c) 123.005

显示解答

1.23005e2 (6 significant digits)

d) 146000

显示解答

1.46e5 (3 significant digits)。请注意,我们假设整数部分末尾的零(无小数部分)不属于有效数字。

e) 146000.001

显示解答

1.46000001e5 (9 significant digits)

f) 0.0000000008

显示解答

8e-10 (1 significant digit).正确的有效数字是8(具有1个有效数字位),而非8.0(具有2个有效数字位)。

g) 34500.0

显示解答

3.45000e4 (6 significant digits).我们在此处不截断尾部零,因为该数值确实包含小数点。尽管小数点不影响数值本身,但它会影响精度,因此必须包含在有效数字中。

若数值被指定为34500,则结果应为3.45e4(3个有效数字)。

h) 146000(需理解尾部零具有有效性)

显示解答

1.46000e5 (6 significant digits).
posted @ 2026-02-14 07:20  游翔  阅读(1)  评论(0)    收藏  举报