Python 计算欧拉';s号
我正在写一些代码来生成数学常数e(欧勒数)的数字,精度可以任意Python 计算欧拉';s号,python,decimal,Python,Decimal,我正在写一些代码来生成数学常数e(欧勒数)的数字,精度可以任意 from decimal import Decimal, getcontext import decimal s = 300_000 n = Decimal(1) x = Decimal(1) print("[+] Summing numbers...") getcontext().prec = s for i in range(s, 1, -1): x *= i n += x resul
from decimal import Decimal, getcontext
import decimal
s = 300_000
n = Decimal(1)
x = Decimal(1)
print("[+] Summing numbers...")
getcontext().prec = s
for i in range(s, 1, -1):
x *= i
n += x
result = (n / x) + Decimal(1.0)
它的迭代次数为200k或更少,但如果我将精度设置得高于此值,则会失败
[+] Summing numbers...
Traceback (most recent call last):
File "D:\OneDrive\Desktop\PYTHON\py\trig\log\calc e\e1_2.py", line 12, in <module>
x *= i
decimal.Overflow: [<class 'decimal.Overflow'>]
>>>
[+]求和数字。。。
回溯(最近一次呼叫最后一次):
文件“D:\OneDrive\Desktop\PYTHON\py\trig\log\calc e\e1_2.py”,第12行,在
x*=i
十进制溢出:[]
>>>
如何使用python存储非常大的数字,即数十万位长的数字,而不抛出十进制。溢出错误?您的问题是按计算顺序。看看你的求和循环:
范围内的i(300000,1,-1):
x*=i
n+=x
这计算300000代码>(阶乘)--这是您的溢出问题。您已超过十进制软件包的最大值
您需要研究所需值的连续近似值,而不是试图划分两个巨大的量
或者,您可以切换到Python大整数。这将非常缓慢,但您会得到结果。十进制存在decimal
模块,用于十进制,即以10为基数表示。对于具有任意精度数字的计算,请使用int
和
使用字符串。数十万个SigFig对计算没有用处,因为超出一点并不重要,您需要在上下文中设置Emax
字段,而不仅仅是prec
@jasonharper我在第11行添加了一行getcontext()。Emax=s
,似乎仍然会抛出相同的错误,但首先为什么要使用decimal
?这些是整数运算。如果您担心结果的精度
,则通过分数
执行此单一操作比十进制
更合适。计算分子x
和分母n
,然后在最后只对它们进行一次除,这似乎是我遇到的计算高精度的最快方法之一(它的速度如此之快,我可以在8秒内计算出大约100k位)。因为计算机非常擅长整数的加法/乘法,可以很快地进行加法,但难以进行除法运算。其中,在每次迭代中划分for循环内的数字非常慢,需要几分钟。就速度而言,我认为我目前的方法是迄今为止我发现的最好的方法,我只需要找到一种存储int的方法。您当前的方法在生成所需结果之前抛出一个异常。如果程序只需要抛出一个异常,我可以让它更快一些。:-)您只需要通过切换方法来处理异常;在开始之前检查迭代值,或者在获得异常时切换。这非常好,谢谢,我如何将结果转换为字符串以存储在文本文件中<代码>打开(“file.txt”,“w”)作为文件:file.write(str(result))
写入一个奇怪的数字140271359018057029500070152531295706311281685896…
等。
from fractions import Fraction
s = 300_000
x = 1
n = 1
for i in range(s, 1, -1):
x *= i
n += x
result = Fraction(n, x) + 1
# Display approximate value (the raw value is huge)
print(float(result)) # 2.718281828459045