繁体   English   中英

尝试表示 2^(-23) 时,无法在单精度 IEEE-754 中掌握“转换引起的错误”

[英]Trouble grasping "error due to conversion" in single-precision IEEE-754 when attempting to represent 2^(-23)

让我先说这个问题,我理解为什么诸如0.13.140.2之类的值和其他不能由两个幂的组合组合的值最终无法用 IEEE-754 格式表示,并且它们可能只能近似为最佳精度允许。

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

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

  • 符号位为0
  • 偏置指数为104 (或二进制为0b01101000 )以说明 127 偏置,导致-23成为最终指数值
  • 尾数的位域完全由0组成,当隐含的1位被计算在内时,其最终值为1.0

然而,将这个特定的位序列存储在 memory 中并以十进制表示法打印出来,小数点后有 25 位精度,结果如下:

0.0000001192092895507812500
                      ^
                      |
                      margin of error starts here

该值恰好包含1.25e-21的错误。 此交互式网站上,此错误值称为“转换导致的错误”。

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

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

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

我用来执行计算的软件将结果截断了三位数字...... 2 -23的精确值恰好是0.000000119209289550781251.1920928955078125e-7 ,这是我之前观察到的 output ,使其正确,没有任何误差。


同样毫无意义的是,该网站提前将尾数的十进制表示形式截断了几位,使得手工计算(即,将尾数与符号位和 2指数相乘)看起来不正确(或至少略有偏差),当它们是事实上不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM