Python 中整数平方根的精确度
Exactness of integer square root in Python
我想了解为什么会发生某些事情。我需要在 Python (isqrt(64) = 8 = isqrt(80)) 中实现整数平方根。我确信天真的方法:
def isqrt(n):
return int(math.sqrt(n))
当传递的 n 是平方数时, 必然会偶尔失败,假设 Python 转换为浮点数,然后对浮点数执行平方根计算。例如,调用 isqrt(13*13) 我预计在转换为浮点数并计算 sqrt 之后,您可以获得类似 12.999999843 的结果,在转换为整数后将得到 12.
但我执行了大循环测试值,无论大小,总能得到正确的结果。毕竟,似乎没有必要为整数实现特殊的平方根!
不理解困扰着我,就像当一些应该工作的东西失败时一样。为什么会这样?
python中还有一个关于整数平方根的问题:Integer square root in python
在那里定义的 isqrt() 中,+0.5 被添加到 n,我想这正是为了解决我提到的我期待的问题,但在特定情况下找不到。
编辑:忘记说明了,我正在使用 Python 2.7
在 C 类型 long
作为 64 位整数和 C 类型 double
作为 64 位 IEEE 浮点数实现的机器上使用 python 2.7 产生
>>> import math
>>> x = (2<<53) + 1
>>> int(math.sqrt(x*x)) == x
False
我作弊选择了一个 64 位 IEEE 浮点数不能准确表示的数字(但 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 (isqrt(64) = 8 = isqrt(80)) 中实现整数平方根。我确信天真的方法:
def isqrt(n):
return int(math.sqrt(n))
当传递的 n 是平方数时,必然会偶尔失败,假设 Python 转换为浮点数,然后对浮点数执行平方根计算。例如,调用 isqrt(13*13) 我预计在转换为浮点数并计算 sqrt 之后,您可以获得类似 12.999999843 的结果,在转换为整数后将得到 12.
但我执行了大循环测试值,无论大小,总能得到正确的结果。毕竟,似乎没有必要为整数实现特殊的平方根!
不理解困扰着我,就像当一些应该工作的东西失败时一样。为什么会这样?
python中还有一个关于整数平方根的问题:Integer square root in python
在那里定义的 isqrt() 中,+0.5 被添加到 n,我想这正是为了解决我提到的我期待的问题,但在特定情况下找不到。
编辑:忘记说明了,我正在使用 Python 2.7
在 C 类型 long
作为 64 位整数和 C 类型 double
作为 64 位 IEEE 浮点数实现的机器上使用 python 2.7 产生
>>> import math
>>> x = (2<<53) + 1
>>> int(math.sqrt(x*x)) == x
False
我作弊选择了一个 64 位 IEEE 浮点数不能准确表示的数字(但 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