让我先说我理解为什么诸如0.1
, 3.14
,之类0.2
的值和其他不能由 2 的幂组合组成的值最终无法由 IEEE-754 格式表示,并且只能在精度允许的情况下尽可能地近似它们.
我难以理解的是为什么尝试表示值2 -23会导致轻微的误差。
2 -23完全等于1.1920928955078e-7
或0.00000011920928955078
。在单精度 IEEE-754 中,它可以构造如下:
- 符号位是
0
- 偏置指数是
104
(或0b01101000
二进制)以解释 127 偏置,导致-23
成为最终指数值 - 尾数的位域完全由
0
s 组成,其最终值是1.0
在考虑隐式1
位时
但是,将此特定位序列存储在内存中并以十进制表示法将其打印出来,精度为小数点后 25 位,结果如下:
0.0000001192092895507812500
^
|
margin of error starts here
这个值包含一个精确的错误1.25e-21
。在此交互式网站上,此错误值称为“转换错误”。
我很难理解这一点——因为我理解,例如,为什么一个值+3.14
不能用单精度位域精确表示。由指数中的值缩放的尾数中 2 的负幂的组合无法准确表示3.14
,因此选择下一个最接近的近似值。因此,预计会出现“由于转换导致的错误”。与此相反,值2 -23能够准确地存储在单精度位域中,但是当转换回十进制表示法时,会出现错误。
显然我有某种误解,但我无法弄清楚到底是哪里。