欧拉-马斯凯罗尼常数

Euler-Mascheroni Constant

在编程中,我只使用整数。但这次是为了一些计算。我需要计算 Euler-Mascheroni Constant γ 。最多 n 位小数。{虽然 n ∈ [30, 150] 对我来说已经足够了。

但是,我怀疑精度 Numerical Algorithm

我需要使用 Python 的更高准确度。

French Wikipedia discussion page开始,小数点后6位的近似值:

import math as m
EulerMascheroniApp = round( (1.-m.gamma(1+1.e-8))*1.e14 )*1.e-6
print(EulerMascheroniApp)
# 0.577216 

这个常量在 sympy 模块中也可用,名称为 EulerGamma:

>>> import sympy
>>> sympy.EulerGamma
EulerGamma
>>> sympy.EulerGamma.evalf()
0.577215664901533
>>> - sympy.polygamma(0,1)
EulerGamma
>>> sympy.stieltjes(0)
EulerGamma
>>> sympy.stieltjes(0, 1)
EulerGamma

文档:

在最后一个文档 link 中,如果 .evalf() 的默认值不够用,您可以找到有关如何更精确地计算常量的更多信息。

如果您仍想自己计算常量作为练习,我建议将您的结果与 sympy 的常量进行比较,以检查准确性和正确性。

您可以计算它使用python小数内置模块来控制您要使用的小数位数(https://docs.python.org/2/library/decimal.html)。

a = 1/7
len(str(a))-2
Out[1] 17

使用十进制:

from decimal import *
getcontext().prec = 90 #90 decimals precision
a = Decimal(1) / Decimal(7)
len(str(a))-2
Out[2] 90

基本上:

n = 100000
Euler_Mascheroni = -Decimal(log(Decimal(n))) + sum([Decimal(1)/Decimal(i) for i in range(1,n)])
Euler_Mascheroni

Out[3] Decimal('0.577210664893199330073570099082905499710324918344701101627529415938181982282214')

最后,您可以“任意”提高精度:

from decimal import *
from math import log

def Euler_Mascheroni(n,nth_decimals = 80):
    getcontext().prec = nth_decimals
    
    SUM = Decimal(0)
    for i in range(1,n):
        SUM+=Decimal(1)/Decimal(i)
    
    return -Decimal(log(Decimal(n))) + SUM
Euler_Mascheroni(100000000,nth_decimals = 120)

给出:

Decimal('0.5772156599015311156682000509495086978690376512201034388184221886576113026091829254475798266636558124658249350393045066')

回复@Stef 的评论

EM = Decimal(0.57721566490153286060651209008240243104215933593992)#reference taken from wikipedia

n = 100000000
Decimal(log(Decimal(n)))

getcontext().prec = 100
SUM = Decimal(0)
for i in range(1,n):
    SUM+=Decimal(1)/Decimal(i)

EM - (SUM-Decimal(log(Decimal(n))))

会给

Decimal('5.00000174 ... 85E-9')