为何计算自然常数e的Python代码输出与math.e存在精度差异?
为何泰勒级数计算的e比math.e多一位小数?
你的代码如下:
import math Sn = 0 x = 1 big_n = 10000 for i in range(0, big_n, 1): Sn = Sn + ((x**i)/(math.factorial(i))) print(Sn) print(math.e)
运行输出:
2.7182818284590455 2.718281828459045
原因可以从这几点理解:
- 双精度浮点数的本质:Python使用64位双精度浮点数存储小数,这类浮点数的有效数字约为15-17位,并没有固定的小数位数。
math.e和你计算的Sn都是双精度浮点数,但它们的二进制存储值存在极细微的差异。 - math.e的特性:
math.e是Python内置的、经过优化的e的近似值,它的二进制编码对应的十进制字符串输出就是2.718281828459045。 - 泰勒级数的舍入误差:你通过10000项累加计算e的过程中,每一步的浮点运算都会产生微小的舍入误差,最终导致
Sn的二进制存储值和math.e略有不同。当Python把这个浮点数转为字符串时,会输出足够多的位数来唯一标识该浮点数,所以末尾多了一位5。 - 数值等价性验证:虽然输出字符串看起来不同,但两个值在双精度浮点数的误差范围内是等价的。你可以测试:
print(math.isclose(Sn, math.e)) # 输出True
内容的提问来源于stack exchange,提问作者Ахмет Мырзакулов
相关产品推荐
相关产品推荐

