首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Sqrt限制?

Python Sqrt限制?
EN

Stack Overflow用户
提问于 2015-01-31 00:08:54
回答 3查看 2K关注 0票数 2

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

代码语言:javascript
复制
y = 10**309
x = y**0.5
print(x)

我得到了这个错误:

代码语言:javascript
复制
x = y**0.5
OverflowError: int too large to convert to float

代码会一直工作到10**308。但除此之外,它似乎已经崩溃了。我也已经在命令行中检查过了。同样的错误。有人能帮帮我吗?

如果这是一个python限制,有没有其他方法可以使用?

编辑:进行了代码更正。

EN

回答 3

Stack Overflow用户

发布于 2015-01-31 00:31:57

用一点数学知识来简化你的问题。

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

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

在您的示例中:

代码语言:javascript
复制
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)

非四舍五入数字示例:

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

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

代码语言:javascript
复制
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位精度。当取something.
  • 1e309的平方根表示10**309,而3.1415e209表示3.1415 * 10**209时,几乎总是会得到浮点数。这是一个标准的编程约定。
票数 2
EN

Stack Overflow用户

发布于 2015-01-31 04:50:24

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

在我的系统上,百万位数的运算速度非常快。

代码语言:javascript
复制
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位数字只需要几秒钟。

代码语言:javascript
复制
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的当前维护者。

票数 1
EN

Stack Overflow用户

发布于 2015-01-31 00:21:59

基于我所认为的similar questions,您可以考虑使用Decimal class

下面是一个使用您所拥有的内容的示例

代码语言:javascript
复制
    >>> 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
    >>> 

可能会有帮助,但它不会给你带来错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28239978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档