泰勒展开与e的求法
大家伙儿知道计算机里的 e e e是怎么求出来的吗?
这还要从神奇的泰勒展开讲起……
简单的说,就是 e e e,可以表示成:
e = 1 0 ! + 1 1 ! + 1 2 ! + ⋯ + 1 n ! + ⋯ e= \frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!} + \cdots+\frac{1}{n!}+ \cdots e=0!1+1!1+2!1+⋯+n!1+⋯
很显然,当 n n n足够小的时候,精度已经很高了,后面的级数是收敛的,可以忽略不计。而这显然可以用计算机来计算。
python和神奇的decimal
很多人习惯用python算高精度整数,因为python的整数是高精度的,但是浮点数却只有32位,这里python提供了一个神奇的库“decimal”,这个库可以让你指定小数的精度,相当于“高精度小数”。
计算
import decimal Precision=20000 decimal.getcontext().prec=Precision
我们可以像这样给它设置一个精度。
然后紧接着代入我们的展开式,一般来说算到精度位就差不多了。
E=decimal.Decimal(0) nFrac=decimal.Decimal(1) for N in range(1,Precision+1): E+=nFrac nFrac/=N print(E)
比较
我们用专业软件” m a t h e m a t i c a mathematica mathematica“计算 e e e的20000位,并存成字符串传入decimal,这里要注意必须用字符串而不是直接写小数,因为默认小数只有32bit会丢失剩余精度。


这里我们让 m a t h e m a t i c a mathematica mathematica的 e e e和我们的 e e e作差,误差只有1.7e-19998,相当于不到 2 ⋅ 1 0 − 19998 2\cdot 10^{-19998} 2⋅10−19998,所以只要稍微调高精度就能精确到20000位了。
完整代码
import decimal Precision=20000 decimal.getcontext().prec=Precision E=decimal.Decimal(0) nFrac=decimal.Decimal(1) for N in range(1,Precision+1): E+=nFrac nFrac/=N e=decimal.Decimal('2.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') print(E-e)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209370.html原文链接:https://javaforall.net
