【问题标题】:Why number are (not) representable in double precision IEEE754?为什么数字在双精度 IEEE754 中(不能)表示?
【发布时间】:2017-01-10 12:16:39
【问题描述】:

我对 IEEE754 双精度感到困惑,我考虑了两个问题:
1. 为什么区间中的每个数字 -254, -254+2, -254+4...254 是可表示的?

2. 为什么 254+2 不可表示?

你能帮帮我吗?我了解 IEEE754 的工作方式 - 但是,我在 看到 时遇到了问题。

【问题讨论】:

  • 问题2提示:表示2^{54}+2需要多少位? IEEE-754 binary64(双精度数)的有效位(尾数)包含多少位?
  • 请注意,this style 用于代码,而不是用于随机强调单词。并且可以使用语法 -254. 输入指数
  • 不幸的是,“正确的”指数在 cmets 中不起作用,最后我检查了一下。我希望 SE 人员最终能够为 SO 启用 MathJax。
  • @njuffa 我可以看到尾数总是 $

标签: floating-point ieee-754 theorem


【解决方案1】:

IEEE 754 双精度数的有效位(或尾数)有 53 位。 −254 可以精确表示为

mantissa: 1.00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00 (bin)
exponent: 54
sign:     1

现在让我们暂时忘记符号位。与此解释无关。所以假设我们有 +254

有了这个指数,有效数的最低位——最右位的值为 2-52 * 2 54 = 4。所以 254 + 4 编码为:

mantissa: 1.00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 01 (bin)
exponent: 54                                                             ^
                                                                lowest bit

但两者之间没有任何价值。所以你不能编码 254 + 2

为什么 −254 + 2 不是问题?因为这与-(254 - 2)相同,表示为:

mantissa: 1.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11
exponent: 53 !!
sign:     1

指数 53 表示您有 2-52 * 253 = 2 的步数。接下来的 0 值是:

mantissa: 1.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 10
exponent: 53
sign:     1

是-254 + 4,或者实际上是-(254 - 4)。你可以这样继续下去,直到达到 -253

【讨论】:

  • 2^54 - 1 在 IEEE 754 binary64 中无法表示。你的意思是2^53 - 1? (或2^54 - 2?)2^54 + 2 也不是。看起来你的指数都偏了一个。
  • 啊,我明白了。当您计算有效位的最低有效位的值时,您希望乘以 2^-52 而不是 2^-53。
  • 是的,我一直以 1 个指数的幅度偏离。修改答案。我还没喝咖啡。
  • 有了这个指数,有效数的最低——最右——位的值为 2^{-52} * 2^{54} = 4不是真的,毕竟我们总是 1. - 我的意思是它是 (1+2^{-52}) * 2^{54}
  • 我明白为什么 2^{52} +2 不可表示。我不明白你为什么写 (2^{-52} * 2^54)。在我看来,你应该写 ((1+2^{-52})*2^{54})。毕竟,每个尾数(归一化数)> 1,但是你的尾数 = 2^{-52}
猜你喜欢
  • 2022-09-24
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2012-02-28
  • 2020-04-06
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多