Python小浮点数-算术精度

3
如果我在Python 3中运行以下代码:

1.0 + 1e-16

我的结果是:

1.0

我想知道为什么?假设这些数字被存储为IEE754双精度(64位),那么我有以下表示这些数字的方式:
数字1:
  • 符号:0
  • 指数:01111111111 --> 十进制数为1023
  • 尾数:0...0
数字1e-16:
  • 符号:0
  • 指数:01111001101 --> 十进制数为973
  • 尾数:0010000000111010111110011110111001110101011000010110
为了将这两个数字相加,我必须将小数字的指数增加50个单位以适应数字1.0的表示。如果我这样做,尾数变为:
  • 0.0...0100
在将两个尾数相加后,我的结果应该是:
  • 符号:0
  • 指数:01111111111
  • 尾数:0000000000000000000000000000000000000000000000000100
但这与1.0不相等。有人能解释或给我一个提示吗?
1个回答

3

你对1e-16进行的二进制转换似乎不正确:float.hex(1e-16) 产生的结果为 0x1.cd2b297d889bcp-54,这意味着(无偏)指数为-54(十进制),而不是-50。然后,前导1掉落在尾数末尾,最终得到了零。


谢谢,你是对的!如果我将matnissa向右移动54位,那么1e-16就变成了0,输出就正确了。 - jSh4rk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接