关于Python实现e的麦克劳林级数计算代码的技术疑问
麦克劳林级数计算e的Python代码疑问解答
计算e的Python代码
from math import log10, exp places = int(input('Enter the number of decimal places: ')) one = 10**places extra = 10**4 n = 1 term = one * extra eee = 0 count = 0 while term > 0: eee += term count += 1 term = term // n n += 1 eee = eee // extra intPart = eee // one fracPart = eee % one eee = str(intPart)+'.'+ '0'*(places - (int(log10(fracPart)) + 1))+str(fracPart) print(""" Python's value of e is:\n%.15f\n e to %d decimal places is:\n%s\n The number of terms in the series is %d""" \ % (exp(1), places, eee, count))
技术疑问
- 使用extra变量的原因是什么?
- 麦克劳林级数的首项为1,但为何初始term被赋值为
one * extra? - 循环条件设置为
term > 0的原因是什么? - 语句
term = term // n的逻辑依据是什么?
疑问解答
关于extra变量:
这是用来做精度补偿的。代码全程用整数运算(//取整),会丢失小数部分,提前乘上10^4这个放大因子,能让计算过程中保留更多有效数字,最后再除掉这个因子,避免多次取整导致最终结果精度不足。简单说就是用额外的位数抵消取整误差,保证目标小数位的准确性。初始term的赋值:
e的麦克劳林级数是e = 1 + 1/1! + 1/2! + 1/3! + ...,首项是1。这里的one是10^places,对应“1加上places位小数”的单位(比如要算5位小数,one就是100000,代表1.00000)。乘上extra后,相当于把首项1放大成整数,全程用整数运算避免浮点精度损失,后续所有级数项也基于这个放大值计算。循环条件
term > 0:term是放大后的级数项,当它变成0时,说明这个项的实际数值已经小到不会影响最终结果的精度了(放大10^4倍后还是0,实际值小于1/10000,对我们要的places位小数来说可以忽略)。所以循环到term为0就停止,没必要再计算更小的项。term = term // n的逻辑:
级数的项是递推的:第一项是1,第二项是1/1! = 第一项/1,第三项是1/2! = 第二项/2,第四项是1/3! = 第三项/3,以此类推。每个后项都是前项除以当前的n(n从1开始递增)。因为我们用整数放大值计算,所以用整数除法//代替浮点除法,全程保持整数运算,避免精度丢失。
内容的提问来源于stack exchange,提问作者KarimIkramul
相关产品推荐
相关产品推荐

