我可以天真地检查 a/b == c/d 吗?

bma*_*cho 3 c++ python precision

当我必须用有理数(分子和分母整数)做一些算术时,我正在做 leetcode。

我需要在列表中计算坡度。在Python中

collections.Counter( [ x/y if y != 0 else "inf" for (x,y) in points ] )
Run Code Online (Sandbox Code Playgroud)

完成了这项工作,我通过了所有测试。((编辑:他们在评论中指出,练习中的数字要小得多,而不是一般的 32 位整数))

我想知道这是否正确,也就是说,对于 a,b,c,d 32 位整数,python 是否正确识别 a/b == c/d 作为有理数。我也对 C++ 的案例感兴趣,以及任何可能有用的其他事实(枪炮、最佳实践、背后的理论(如果不是太长的话)等)。

另外,这个问题似乎很常见且有用,但我并没有真正找到任何相关信息(给我重复项!),也许我遗漏了一些重要的关键字?

Bat*_*eba 6

假设您不想考虑整数除法的影响,请检查等效项ad == bc

这在数值上更加稳定。在 C++ 中你可以写

1LL * a * d == 1LL * b * c
Run Code Online (Sandbox Code Playgroud)

以防止溢出。


Kel*_*ndy 5

这并不安全,而且我至少见过一个 LeetCode 问题,你会失败(也许是Max Points on a Line)。例子:

\n
a = 94911150\nb = 94911151\nc = 94911151\nd = 94911152\nprint(a/b == c/d)\nprint(a/b)\nprint(c/d)\n
Run Code Online (Sandbox Code Playgroud)\n

尽管斜率实际上不同,但和a/b都是c/d相同的值(在线尝试!):float

\n
True\n0.9999999894638303\n0.9999999894638303\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用或之后的fractions.Fraction(x, y)元组(如果我没记错的话,这比类更轻量/高效)。(x//g, y//g)g = math.gcd(d, y)Fraction

\n