0

让我先说我理解为什么诸如0.1, 3.14,之类0.2的值和其他不能由 2 的幂组合组成的值最终无法由 IEEE-754 格式表示,并且只能在精度允许的情况下尽可能地近似它们.

我难以理解的是为什么尝试表示值2 -23会导致轻微的误差。

2 -23完全等于1.1920928955078e-70.00000011920928955078。在单精度 IEEE-754 中,它可以构造如下:

  • 符号位是0
  • 偏置指数是104(或0b01101000二进制)以解释 127 偏置,导致-23成为最终指数值
  • 尾数的位域完全由0s 组成,其最终值是1.0在考虑隐式1位时

但是,将此特定位序列存储在内存中并以十进制表示法将其打印出来,精度为小数点后 25 位,结果如下:

0.0000001192092895507812500
                      ^
                      |
                      margin of error starts here

这个值包含一个精确的错误1.25e-21。在此交互式网站上,此错误值称为“转换错误”。

我很难理解这一点——因为我理解,例如,为什么一个值+3.14不能用单精度位域精确表示。由指数中的值缩放的尾数中 2 的负幂的组合无法准确表示3.14,因此选择下一个最接近的近似值。因此,预计会出现“由于转换导致的错误”。与此相反,值2 -23能够准确地存储在单精度位域中,但是当转换回十进制表示法时,会出现错误。

显然我有某种误解,但我无法弄清楚到底是哪里。

4

1 回答 1

1

2 -23实际上并不完全等于1.1920928955078e-7

我用来执行计算的软件将结果截断三位数...... 2 -23的确切值是0.00000011920928955078125, 或1.1920928955078125e-7,这是我之前观察到的输出,使其正确,没有任何误差.


网站提前将尾数的十进制表示截断几位数也是毫无价值的,手工计算(即将尾数乘以符号位和 2指数)似乎不正确(或至少略微偏离)。事实上不是。

于 2021-09-26T18:56:53.850 回答