在Python 3中大于10 ^ 2000的数字的平方根

立方AD

我想在Python中计算大于10 ^ 2000的数字的平方根。如果我将此数字当作普通整数对待,我将始终得到以下结果:

Traceback (most recent call last):
  File "...", line 3, in <module>
    print( q*(0.5)  )
OverflowError: int too large to convert to float

我该如何解决?还是存在除使用Python之外的其他可能性来计算此平方根?

罗里·道顿

通常的平方根方法在执行计算之前将参数转换为浮点值。如您所见,这不适用于非常大的整数。

因此,请使用旨在处理任意大整数的函数。这是一个,保证返回正整数的平方根的正确整数部分。此函数删除结果的小数部分,这可能是您想要的,也可能不是您想要的。由于此函数使用迭代,因此它也比内置平方根例程慢。Decimal模块可以处理比内置例程更大的整数,但是必须预先定义值的精度,因此它不能处理任意大的值。

import math

_1_50 = 1 << 50  # 2**50 == 1,125,899,906,842,624

def isqrt(x):
    """Return the integer part of the square root of x, even for very
    large integer values."""
    if x < 0:
        raise ValueError('square root not defined for negative numbers')
    if x < _1_50:
        return int(math.sqrt(x))  # use math's sqrt() for small parameters
    n = int(x)
    if n <= 1:
        return n  # handle sqrt(0)==0, sqrt(1)==1
    # Make a high initial estimate of the result (a little lower is slower!!!)
    r = 1 << ((n.bit_length() + 1) >> 1)
    while True:
        newr = (r + n // r) >> 1  # next estimate by Newton-Raphson
        if newr >= r:
            return r
        r = newr

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章