欧拉-马斯凯罗尼常数
Euler-Mascheroni Constant
在编程中,我只使用整数。但这次是为了一些计算。我需要计算 Euler-Mascheroni Constant γ
。最多 n 位小数。{虽然 n ∈ [30, 150]
对我来说已经足够了。
- [x] = gif(x) = math.floor(x)
但是,我怀疑精度
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')
在编程中,我只使用整数。但这次是为了一些计算。我需要计算 Euler-Mascheroni Constant γ
。最多 n 位小数。{虽然 n ∈ [30, 150]
对我来说已经足够了。
- [x] = gif(x) = math.floor(x)
但是,我怀疑精度 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')