我试图用python实现欧拉的方法来计算一系列数字,但问题是N很大(10000000(。蟒蛇不断告诉我溢出。有人知道更好的计算方法吗?
def facto(n):
if n == 0:
return 1
else:
return n*facto(n-1)
def exp(x, n):
my_sum = 0.0
for i in range(n+1):
my_sum += (x**i)/facto(i)
return my_sum
def r(n):
return int(exp(x, n)*n)/n
对于范围(1,N(中的i:打印(r(i((
#factor是我用来计算数字的阶乘的函数
重新
代码问题:
- 函数r(n(应具有x作为输入,即
def r(x, n):
- 函数exp,第
my_sum += (x**i)/facto(i)
行得到错误OverflowError:int太大,无法转换为float,例如当N=1000时 - 事实是递归的,因此将在n~1000处达到最大递归深度
选项1--使用对数进行除法
import math
def facto(n):
' Iterative calculation for factorial to prevent reaching max recursion depth which occurs for n ~ 1000 '
result = 1
for i in range(1, n+1):
result *= i
return result
def log_divide(num, denom):
' Division using log function '
return math.exp(math.log(num) - math.log(denom)) # subtract to logs, then exponentiate
def exp(x, n):
my_sum = 0.0
for i in range(n+1):
my_sum += log_divide(x**i, facto(i))
return my_sum
def r(x, n):
return int(exp(x, n)*n)/n
选项2——使用十进制模块,允许任意精度
import math
from decimal import Decimal, getcontext
getcontext().prec = 50 # Set precision for decimal arithmetic
def facto(n):
' Iterative calculation for factorial to prevent reaching max recursion depth which occurs for n ~ 1000 '
result = 1
for i in range(1, n+1):
result *= i
return result
def exp(x, n):
my_sum = Decimal(0.0)
for i in range(n+1):
my_sum += Decimal((x**i))/Decimal(facto(i))
return my_sum
def r(x, n):
return int(exp(x, n)*n)/n
用法
两个版本都适用于N==1000:
r(1.0, 1000)
Out: 2.718
阶乘变得非常快非常大。与其计算每个项的阶乘,不如从上一项计算下一项:
def exp(x, n):
r = 1
result = 1.0
for i in range(1, n+1):
r *= x/i
result += r
return result