我正在处理非常大的数字(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的限制,是否有其他方法可以使用?
编辑:进行代码更正。
基于我认为类似的问题,您可以研究使用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
>>>
可能会有帮助,它不会给你错误。
您应该使用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
处理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
的当前维护者。
用一点数学知识简化你的问题。
请注意,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
。这是一个标准的编程约定。
使用next export,我们创建了个静态 HTML 应用。构建时将会运行页面里生命周期getInitialProps 函数。 req和res只在服务端可用,不能通过getInitialProps。 所以你不能预构建 HTML 文件时动态渲染 HTML 页面。如果你想动态渲染可以运行next start或其他自定义服务端 API。
问题内容: 我正在使用MySQL存储财务资料,并使用数据来构建每个帐户的所有交易记录等。出于性能方面的考虑-为了防止用户被庞大的表格所淹没-我对结果进行了分页。 现在,作为注册的一部分,我将显示该帐户的余额。因此,如果我每页显示20个事务,而我显示第二页,则使用如下数据: 事务0-19: 忽略它们-它们比正在查看的页面要新。 交易20-39: 从中选择所有内容-它们会显示出来。 事务40-??:
问题内容: 我如何从elasticsearch中获取所有结果,因为结果仅显示限制为10。我有一个查询,像: 我已将限制设置为15,但我不想使其无限,以便我可以获取所有数据,因为我的数据不断变化,并且我想获取所有数据,所以我无法设置限制。 问题答案: 您可以使用和参数浏览所有数据。这可能非常慢,具体取决于您的数据以及索引中有多少。 http://www.elastic.co/guide/zh-CN/
对“每个具体类映射一张表”(table per concrete-class)的映射策略而言,隐式多态的方式有一定的限制。而 <union-subclass> 映射的限制则没有那么严格。 下面表格中列出了在 Hibernte 中“每个具体类一张表”的策略和隐式多态的限制。 表 9.1. 继承映射特性(Features of inheritance mappings) 继承策略(Inheritanc
问题内容: 我正在通过migrations.changeColumn函数在迁移中添加一个约束。 添加约束是可行的,但是由于您需要提供Possibly unhandled SequelizeDatabaseError: relation “myAttribute_unique_idx” already exists`。 (使用的数据库是postgres) 我也尝试过使用removeIndex 但是在
我正在使用自定义分析(而不是谷歌分析)设置活动跟踪,并为此设置接收器。我的接收器似乎在工作,但当我安装时,我收到一个android lint警告: 它看起来像任何旧的Android应用程序可以调用我的应用程序与意图,我不希望。应该只有谷歌应用商店(或任何其他Android系统应用程序,将安装我的应用程序从play store)发送该意图到我的应用程序。 因此,我试图找出如何设置将有效应用程序限制在
本文向大家介绍Android权限控制之自定义权限,包括了Android权限控制之自定义权限的使用技巧和注意事项,需要的朋友参考一下 天哪,这篇文章终于说道如何自定义权限了,左盼右盼,其实这个自定义权限相当easy。为了方便叙述,我这边会用到两个app作为例子示范。 Permission App: used to define a new permission 这个作为定义权限的App,我称之为Pe
本文向大家介绍Android Broadcast 和 BroadcastReceiver的权限限制方式,包括了Android Broadcast 和 BroadcastReceiver的权限限制方式的使用技巧和注意事项,需要的朋友参考一下 在Android应用开发中,有时会遇到以下两种情况, 1. 一些敏感的广播并不想让第三方的应用收到 ; 2. 要限制自己的Receiver接收某广播来源,避免被