定义式收敛非常慢,无法直接用于计算。
查询Sympy中关于该常数的源代码,使用的是所谓Brent-McMillan公式:
$$\gamma=\lim_{n\to\infty}\frac{\sum_{k=0}^{\infty}(\frac{n^k}{k!})^2H_k}{\sum_{k=0}^{\infty}(\frac{n^k}{k!})^2}-\ln n,$$
其中$H_0=0$,$H_k=1+1/2+1/3+\ldots+1/k$,误差界大约是$O(e^{-4n})$,收敛非常快。
不过Sympy中封装了一层十进制与二进制之间的精度转换控制,计算比较繁琐,因而此处的代码改写自此页面的Mathematica代码,使用的公式相同。
最终代码有七行。
代码长度:165字节 vs. 全站第一:81字节。
from decimal import*
getcontext().prec,d=1002,Decimal
n=d(999)
a=u=-d(n).ln()
b=v=i=d(1)
while i<2900:k=(n/i)**2;a*=k;b*=k;a+=b/i;u+=a;v+=b;i+=1
print(str(u/v)[:-2])
|