gpt4 book ai didi

python - Python中整数平方根的准确性

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

我想了解为什么会发生某些事情。我需要在 Python 中实现整数平方根 (isqrt(64) = 8 = isqrt(80))。我确信天真的方法:

def isqrt(n):
return int(math.sqrt(n))

假设 Python 转换为 float ,然后对 float 执行平方根计算,当传递的 n 是平方数时,

必然会偶尔失败。例如,调用 isqrt(13*13) 我预计在转换为 float 并计算 sqrt 之后,您会得到类似于 12.999999843 的结果,在转换为整数后将得到 12。

但我执行了大循环测试值,无论大小,总能得到正确的结果。毕竟,似乎没有必要为整数实现特殊的平方根!

不理解困扰着我,就像当一些应该工作的东西失败时一样。为什么会这样?

关于python中的整数平方根还有一个问题:Integer square root in python

在那里定义的 isqrt() 中,+0.5 被添加到 n,我猜这正是为了解决我提到的我期待但在特定情况下找不到的问题。

编辑:忘记说明了,我使用的是 Python 2.7

最佳答案

在 C 类型的机器上使用 python 2.7 long作为 64 位整数和 C 类型 double实现为 64 位 IEEE float 产生

>>> import math
>>> x = (2<<53) + 1
>>> int(math.sqrt(x*x)) == x
False

我作弊并选择了一个 64 位 IEEE float 不能准确表示的数字(但 python 的整数类型可以),(2<<53) + 1 . Python 2.7 计算 x*x作为 python 2.7 long整数。 (注意:这与 C 中的 long 不同;python 2.7 可以将 2<<600 表示为整数,但 C 不能。)

说到 2<<600 ,

>>> import math
>>> x = 2<<600
>>> int(math.sqrt(x*x)) == x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float

关于python - Python中整数平方根的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34918504/

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