计算欧拉数
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 为基数的表示形式。对于任意精度数字的计算,使用 int
和 fractions.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
我正在编写一些代码来生成数学常数 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 为基数的表示形式。对于任意精度数字的计算,使用 int
和 fractions.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