我正在使用非常大的数字(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限制,我可以使用另一种方法吗?
编辑:进行代码更正。
答案 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**309
,3.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
>>>
可能会有所帮助,它不会给您错误。