gpt4 book ai didi

python - 为什么 math.sqrt() 对于大数不正确?

转载 作者:行者123 更新时间:2023-11-28 19:53:54 24 4
gpt4 key购买 nike

为什么 math 模块返回错误的结果?

第一次测试

A = 12345678917
print 'A =',A
B = sqrt(A**2)
print 'B =',int(B)

结果

A = 12345678917
B = 12345678917

这里,结果是正确的。

第二次测试

A = 123456758365483459347856
print 'A =',A
B = sqrt(A**2)
print 'B =',int(B)

结果

A = 123456758365483459347856
B = 123456758365483467538432

这里的结果是不正确的。

为什么会这样?

最佳答案

因为 math.sqrt(..) 首先将数字转换为 float ,而 float 有限 mantissa :它只能正确表示数字的一部分。所以 float(A**2) 不等于 A**2。接下来它计算 math.sqrt,这也是大致正确的。

大多数使用 float 的函数永远不会完全正确地对应于它们的整数对应物。浮点计算几乎本质上是近似的。

如果一个人计算A**2 一个人得到:

>>> 12345678917**2
152415787921658292889L

现在,如果将其转换为 float(..),将得到:

>>> float(12345678917**2)
1.5241578792165828e+20

但是如果你现在问这两者是否相等:

>>> float(12345678917**2) == 12345678917**2
False

因此在将其转换为 float 时信息丢失了。

您可以在关于 IEEE-754 的维基百科文章中阅读更多关于 float 如何工作以及为什么它们是近似值的信息,这是关于 float 如何工作的正式定义。

关于python - 为什么 math.sqrt() 对于大数不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551529/

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