python – 浮点除法的一致性

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

但是,在本申请中,我试图确定两个分数a / b和c / d是否相等.如果是,那么存在整数e和f,使得a * e = c * f并且b * e = d * f.假设a,b,c,d,e,f都是正整数,它们可以精确地表示在浮点值中.

在实践中,简单地将a / b与c / 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 / b和c / d在精确算术中具有相同的值,则由于IEEE 754舍入是一致且确定的,因此a / b和c / d必须在IEEE 754浮点中具有相同的结果.

这只适用于a / b和c / d在精确算术中确实具有相同值的情况. a,b,c或d中的舍入误差可以将其抛弃.而且,反过来并不成立;如果浮点数为a / b == c / d,那并不意味着a / b和c / d在精确算术中是相等的.

而不是处理浮点舍入,为什么不坚持整数?

a*d == b*c

可以在非整数算术中完成.或者,为什么不使用完全合理的类型呢?

from fractions import Fraction

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