gpt4 book ai didi

python - 浮点除法的一致性

转载 作者:太空宇宙 更新时间:2023-11-03 13:08:42 25 4
gpt4 key购买 nike

众所周知,浮点值不能准确表示每个十进制值。因此,1/3 的浮点值不完全是 1/3。因此,通常不建议直接比较浮点值。

但是,在此应用程序中,我试图确定两个分数 a/b 和 c/d 是否相等。如果是,则存在满足 a * e = c * fb * e = d * f 的整数 e 和 f。假设a、b、c、d、e、f都是正整数,可以精确地用浮点值表示。

在实践中,简单地将 a/bc/d 进行比较是可行的,但它能保证有效吗? Python 和/或 IEEE-754 中有什么东西可以保证这种方案有效吗?

示例代码(显示此方案适用于合理数量的值):

a = 1.0
b = 3.0
for c in xrange(1, 999):
assert a / b == (a * c) / (b * c)

如果这不能保证,是否有一个反例,其值 a、b、c、d 使得 a/b = c/d(在数学中)但 Python 无法比较 a/b == c/d?同样,这些都是 Python 可以用其浮点值精确表示的正整数。

最佳答案

IEEE 754 除法被指定为表现得好像您计算了除法的精确结果,然后对精确结果进行了四舍五入。如果 a/bc/d 在精确算术中具有相同的值,那么由于 IEEE 754 舍入是一致且确定的,a/bc/d 在 IEEE 754 float 中必须具有相同的结果。

不过,只有当 a/bc/d 在精确算术上确实具有相同的值时,这才成立。 abcd 中的舍入错误会引发此问题。同样,反之亦然。如果 a/b == c/d 是 float ,那并不意味着 a/bc/d 完全相等算术。


与其处理 float 舍入,不如处理整数?

a*d == b*c

可以用未舍入的整数算术来完成。或者,为什么不使用精确的有理类型?

from fractions import Fraction

Fraction(a, b) == Fraction(c, d)

关于python - 浮点除法的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49837159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com