Python small floats - 算术精度

Python small floats - arithmetic precision

如果我运行下面的代码在python3

1.0 + 1e-16

我明白了

1.0

因此。我想知道为什么?假设数字存储为 IEE754 双精度(64 位),那么我有这些数字的以下表示形式:

1 号:

1e-16号:

为了将两个数字相加,我必须将小数的指数增加 50 以适应数字 1.0 表示的指数。如果我这样做,尾数变成:

添加两个尾数后我的结果应该是:

这不等于 1.0。有人可以解释或提示我忽略了什么吗?

您将 1e-16 转换为二进制似乎不正确:float.hex(1e-16) 生成 0x1.cd2b297d889bcp-54,这意味着(无偏)指数是十进制的 -54,而不是 -50。然后前导 1 从有效数字的末尾掉落,你最终得到零。