当前位置: 首页 > 知识库问答 >
问题:

Python sqrt限制非常大的数字?

徐卓
2023-03-14

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

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个答案

倪鹏
2023-03-14

基于我认为类似的问题,您可以使用Decimal类。

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

>>> 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

可能是有帮助的,它不会给你错误。

景恩
2023-03-14

您应该使用gmpy2模块。它提供了非常快的多精度算法

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

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

处理100000000位数字只需几秒钟。

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的当前维护者。

林冥夜
2023-03-14

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

请注意,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。这是一个标准的编程约定。

  •  类似资料:
    • 我搜索了数据库和食谱,但似乎找不到正确的答案。我有一个非常简单的python代码,它总结了一个范围内的自我权力。我需要这个非常非常大的数字的最后十位,我已经尝试了get上下文(). prec,但是我仍然达到了极限。 代码如下: 我怎么能看到这些美丽的数字?它在我的四核上打印速度相对较快。这只是为了给ProjectEuler带来乐趣,问题#48,请不要破坏者。我不想要解决方案,也不想让工作为我完成,

    • 问题内容: 我一直在考虑使用Python进行快速手牌评估。在我看来,加快处理速度的一种方法是将所有牌面和西服表示为质数,然后将它们相乘以表示手: 和 这将为每只手提供一个数值,通过模可以告诉我手中有多少个国王或有多少个心。例如,任何有五个或更多球杆的手都会平均除以;任何有四位国王的手将平均除以,依此类推。 问题在于,像这样的七张牌手的散列值约为62.7万亿次,这将需要超过32位才能在内部进行表示。

    • 问题内容: 我有一张表,其中有一列,有330万个条目。我想遍历表,每200个条目执行一次操作。我有以下代码: 最初,此方法运行良好(生成tmp表的时间约为0.15秒),但偶尔会变慢,例如,大约有30万张票,它开始花费11-12秒的时间来生成此tmp表,然后大约有40万张。基本上看来是不可靠的。 我将在其他查询中使用这些ID,因此我认为在tmp表中放置ID的最佳位置。有没有更好的方法来遍历这样的结果

    • 问题内容: 在HighChart中,我需要针对x和y轴绘制一系列数据。HighChart希望数据为json格式。即[[x,y],[x,y]……[x,y]]。其中x和y是时间(1392345000-Unix纪元格式)和值(49.322)。因此,我正在进行ajax调用以获取数据,并成功将json返回的数据渲染为highchart。在大多数情况下,即,如果data([x,y])的计数低于87500行,则

    • 问题内容: 我们如何在Java中生成非常大的随机数?我说的是10000位数吗?我知道我们必须使用BigInteger,但是我们该怎么做呢?做这样的事情最有效的方法是什么?请提供一个小例子。谢谢。 问题答案: 嗯,一种方法是转到Random.org并下载二进制随机文件之一。这些文件是由大气噪声生成的,因此非常随机。我在国际象棋引擎中将其用于Zobrist键。 或者你可以去 这会给你你想要的。在此示例

    • 我正在使用在我的客户端应用程序中执行以及 最大数据包大小限制也存在于中,即?但是我可以使用中的发送大于最大数据包大小的数据块 这是怎么运作的?这是因为是基于流的,负责在较低层创建数据包吗?有什么方法可以增加UDP中的最大数据包大小吗? 当我在客户端读取时,我从服务器端发送的UDP数据包的一些字节是否可能丢失?如果是,那么有没有办法只检测UDP客户端的损失?