gpt4 book ai didi

浮点除法的Python相等性

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

使用 Python 3,以下如何返回 True

a = 2/3
b = 4/6
print(a == b)

我有一个算法,需要对数字列表进行排序,每个数字都是 x/y 形式,其中 x 和 y 是整数。 (y != 0)。

我担心除法的数值精度会导致上述情况的不稳定和任意排序。 This being an example of relevant comments.但是,根据示例和更大的整数,这似乎不是问题。

Python 是否将 b 的分子和分母中的 2 的公因子去掉,并保留 a 和 b 不只是 float 的信息?

最佳答案

Python 遵循 IEEE 754浮点规范。*(64 位)IEEE float 本质上是基数 2 的一种形式 scientific notation , 分割如下:

  • 一位用于符号(正或负)
  • 53 位用于尾数或尾数,包括隐含的前导数。
  • 11 位的指数。

将浮点值乘以或除以 2,或任何 2 的幂,只会影响指数,不会影响尾数。**因此,它本身通常是一个相当“稳定”的操作,所以 2/3 应产生与 4/6 相同的结果。然而,IEEE float 仍然存在以下问题:

  • 大多数操作都不是关联的(例如,在一般情况下,(a * b) * c != a * (b * c))。
  • 不需要正确舍入更复杂的运算(但是,正如 Tim Peters 指出的那样,除法当然不是“更复杂”的运算,并且会被正确舍入)。***
  • 中间结果总是四舍五入到 53 位。

您应该准备好处理这些问题,并假设大多数数学上等效的浮点表达式不会产生相同的值。具体在 Python 中,您可以使用 math.isclose()估计两个 float 是否“足够接近”以达到“可能相同的值”。


* 实际上,这是一个谎言。 Python 遵循 C 的 double,它几乎总是以某种方式遵循 IEEE 754,但在足够奇特的体系结构上可能会偏离它。在这种情况下,C 标准几乎不提供任何保证,因此您必须查看您的体系结构或编译器的浮点文档。

** 如果指数没有上溢或下溢。如果是这样,那么您通常会分别落在适当签名的无穷大或零上,或者您可能会下溢到 denormal number。取决于体系结构和/或 Python 的编译方式。

*** 由于 IEEE 754 made a lot of operations optional while still demanding precision,确切的“更复杂”操作集有所不同。 .因此,给定的操作是符合 IEEE 754 还是仅符合臭名昭著的松散 C 标准,这一点很少是显而易见的。在某些情况下,操作可能不符合任何标准。

关于浮点除法的Python相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46881382/

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