Python small floats - 算术精度
Python small floats - arithmetic precision
如果我运行下面的代码在python3
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
- 有效数:000000000000000000000000000000000000000000000000100
这不等于 1.0。有人可以解释或提示我忽略了什么吗?
您将 1e-16 转换为二进制似乎不正确:float.hex(1e-16)
生成 0x1.cd2b297d889bcp-54
,这意味着(无偏)指数是十进制的 -54,而不是 -50。然后前导 1 从有效数字的末尾掉落,你最终得到零。
如果我运行下面的代码在python3
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
- 有效数:000000000000000000000000000000000000000000000000100
这不等于 1.0。有人可以解释或提示我忽略了什么吗?
您将 1e-16 转换为二进制似乎不正确:float.hex(1e-16)
生成 0x1.cd2b297d889bcp-54
,这意味着(无偏)指数是十进制的 -54,而不是 -50。然后前导 1 从有效数字的末尾掉落,你最终得到零。