计算欧拉数

Calculating Euler's number

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

如何使用 python 存储非常大的数字,这些数字有数十万位长,而不引发 decimal.Overflow 错误?

你的问题是按计算顺序排列的。看看你的求和循环:

for i in range(300000, 1, -1):
    x *= i
    n += x

这会计算 300000!(阶乘)——这就是您的溢出问题。您已超过十进制包的最大值。

您需要研究所需值的逐次逼近,而不是试图划分两个巨大的数量。

或者,您可以切换到 Python 大整数 。这会很慢,但你会得到你的结果。

decimal 模块存在于 十进制,即以 10 为基数的表示形式。对于任意精度数字的计算,使用 intfractions.Fraction.

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