Python中整数平方根的精确度

Zeycus

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

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

假设Python转换为浮点数,然后对浮点数进行平方根计算,当传递的n是一个平方数时,注定偶尔会失败。例如,调用isqrt(13 * 13)我希望在转换为浮点数并计算sqrt之后,您将得到类似于12.999999843的信息,将其转换为整数后将得到12。

但是我进行了大循环的测试,无论大小,总是得到正确的结果。毕竟,似乎不需要为整数实现特殊的平方根!

不理解让我感到困扰,就像应该工作的东西失败了一样。为什么会这样呢?

关于python中的整数平方根还有另一个问题: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) + 1Python 2.7计算x*x为python 2.7long整数。(注意:这与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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档