Python Sqrt限制?

时间:2015-01-30 16:08:54

标签: python square-root sqrt

我正在使用非常大的数字(1,000,000位数),我需要计算它们的平方根。我的代码似乎达到了极限。

y = 10**309
x = y**0.5
print(x)

我收到了这个错误:

x = y**0.5
OverflowError: int too large to convert to float

代码一直工作到10 ** 308。但除此之外,似乎已经破裂了。我也在命令行中检查了这个。同样的错误。有人可以帮助我吗?

如果这是python限制,我可以使用另一种方法吗?

编辑:进行代码更正。

3 个答案:

答案 0 :(得分:2)

使用一些数学解释你的问题。

请注意sqrt(a*b) = sqrt(a) * sqrt(b)(至少为实数,正数)。

所以,任何大于10 ^ 100的数字除以10 ^ 100。那个a,除法的结果是b,因此您的原始数字= a * b。 然后使用10 ^ 100(= 10 ^ 50)的平方根,乘以b的平方根,得到答案。

用你的例子:

import math
x = 10**309
a = 1e100
b = 1e209   # Note: you can't calculate this within Python; just use plain math here
y = 1e50 * math.sqrt(1e209)

不太全面的数字示例:

x = 3.1415 * 1e309
a = 1e100
b = 3.1415e209   # Again, just subtract the exponent: 309 - 100
y = 1e50 * math.sqrt(3.1415e209)

或者对于一个不是10的幂的整数,完全写出:

x = 707070
x = 70.707 * 1e4  # note: even number in exponent
x = 70.707e4
a = 1e2  # sqrt(1e2) = 1e1 = 10
b = 70.707e2
y = 10 * sqrt(70.707e2)

一些注意事项:

  • Python可以毫无问题地处理大量整数数字。对于浮点数,它使用标准(C)约定,并将自身限制为64位精度。在取平方根时,你几乎总能获得浮点数。

  • 1e309表示10**3093.1415e209表示3.1415 * 10**209。这是一个标准的编程惯例。

答案 1 :(得分:1)

您应该使用gmpy2模块(https://code.google.com/p/gmpy/)。它提供了非常快速的多精度算法。

在我的系统上,对百万位数字的操作非常快。

In [8]: a=gmpy2.mpz('3'*1000000)
In [9]: %timeit gmpy2.isqrt(a)
10 loops, best of 3: 22.8 ms per loop
In [10]: %timeit (a+1)*(a-1)
10 loops, best of 3: 20.9 ms per loop

使用100,000,000个数字只需要几秒钟。

In [20]: a.num_digits(10)
Out[20]: 99995229
In [21]: %timeit gmpy2.isqrt(a)
1 loops, best of 3: 5.05 s per loop
In [22]: %timeit (a+1)*(a-1)
1 loops, best of 3: 3.49 s per loop

免责声明:我是gmpy2的当前维护者。

答案 2 :(得分:0)

根据我的想法similar questions,您可以考虑使用Decimal class

以下是使用您拥有的内容的示例

    >>> x = 10**309
    >>> y =x**.5
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    OverflowError: long int too large to convert to float
    >>> import decimal
    >>> d = decimal.Decimal(x)
    >>> d.sqrt()
    Decimal('3.162277660168379331998893544E+154')
    >>> float(d.sqrt())
    3.1622776601683792e+154
    >>> 

可能会有所帮助,它不会给您错误。