Python 是否使用 "chop" 而不是 "nearest number" 舍入?
Does Python use "chop" instead of "nearest number" rounding?
我的印象是 Python 使用双精度算法,并进行“最接近”舍入。但是,请考虑以下几点:
在双精度系统中,1.0
之后的下一个数字是1.00...01 = 1 + 2**(-52)
。现在,如果 Python 使用“最接近”舍入,数字 1 + 2**(-53)
应该舍入到 1 + 2**(-52)
。然而,结果却是1 + 2**(-53) == 1
。如果 Python 使用“截断”舍入规则,这将是有意义的,但我的印象是没有人使用它,因为它会使计算偏向较低的结果。
Python 文档对如何处理浮点运算并不严格。一些 Python 实现使用 IEEE 754 和舍入到最近的关系到偶数。
在 IEEE-754 binary64 格式中,也称为“双精度”格式,1+2−53 是 1 和下一个可表示数字 1 之间的中点+2−52。所以这是平局,四舍五入规则适用。 1 的尾数为 1.000…0002,1+2−52 的尾数为 1.000…0012。前者是偶数,所以平局规则选择它,结果为1.
改为考虑 1+3•2−54。这是从1到1+2−52的四分之三。因此,将其舍入到最接近的可表示值将产生 1+2−52。对于 print(1 == 1+3*2**-54)
,您的 Python 实现可能会打印“False”。
我的印象是 Python 使用双精度算法,并进行“最接近”舍入。但是,请考虑以下几点:
在双精度系统中,1.0
之后的下一个数字是1.00...01 = 1 + 2**(-52)
。现在,如果 Python 使用“最接近”舍入,数字 1 + 2**(-53)
应该舍入到 1 + 2**(-52)
。然而,结果却是1 + 2**(-53) == 1
。如果 Python 使用“截断”舍入规则,这将是有意义的,但我的印象是没有人使用它,因为它会使计算偏向较低的结果。
Python 文档对如何处理浮点运算并不严格。一些 Python 实现使用 IEEE 754 和舍入到最近的关系到偶数。
在 IEEE-754 binary64 格式中,也称为“双精度”格式,1+2−53 是 1 和下一个可表示数字 1 之间的中点+2−52。所以这是平局,四舍五入规则适用。 1 的尾数为 1.000…0002,1+2−52 的尾数为 1.000…0012。前者是偶数,所以平局规则选择它,结果为1.
改为考虑 1+3•2−54。这是从1到1+2−52的四分之三。因此,将其舍入到最接近的可表示值将产生 1+2−52。对于 print(1 == 1+3*2**-54)
,您的 Python 实现可能会打印“False”。