Python 计算欧拉';s号

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

我正在写一些代码来生成数学常数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

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