如何更精确地进行二项式系数和阶乘计算?

R S*_*ohn 1 python precision wolfram-mathematica numpy binomial-coefficients

我正在将以下 python 计算的结果与 Mathematica 进行比较:https://www.wolframalpha.com/input ?i=sum+%28500+choose+r+%29%28-1%29%5Er+%2F%28r%21 %29+%2C+r%3D0+至+500

import numpy as np
from decimal import *
import scipy.special
from scipy.special import factorial
getcontext().prec = 30

i = 500
sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=False)) for r in range(i+1)]))
Run Code Online (Sandbox Code Playgroud)

尽管我通过模块在 python 代码中设置了任意精度,但这两个计算都给出了几乎相同的值,i = 400但之后未能收敛decimal。用 Mathematica 计算似乎是正确的。我想知道,对于更大的数据,我们怎样才能在 python 中得到与 Mathematica 相同的结果呢i

小智 5

问题是你的阶乘中有exact=False。

>>> import numpy as np
>>> from decimal import *
>>> import scipy.special
>>> from scipy.special import factorial
>>> getcontext().prec = 30
>>> 
>>> i = 500
>>> sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=False)) for r in range(i+1)]))
Decimal('-7.13859062099388393889008217957')
>>> sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=True)) for r in range(i+1)]))
Decimal('0.196589352363439561009074161963')
Run Code Online (Sandbox Code Playgroud)