版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanchunhui/article/details/81605063
0. 数值分析
数值分析(计算数学)观点,如下两种最常见的浮点数运算过程中损失有效数字的情况。
- 两个相近的数相减
- 两个数量级相差很大的数字相加减
1. (两个数量级相差很大的数字相加减)
- 计算 ,Python math 库中有专门的函数,math.log1p(plus 1)。
- 从计算机数值计算的角度,当
逼近 0 时,
math.log1p(x)
比直接计算math.log(x)+1
不会丢失过多的精度。
math.log1p 的实现原理基于 的泰勒展开:
def log1p(x):
if fabs(x) > 1e-4:
return log(1.0+x)
return (1.0-x*0.5)*x
2. (两个相近的数相减)
- 计算 ,Python math 库中有专门的函数,math.expm1(minus 1)。
- 从计算机数值计算的角度,当
逼近于0时,
math.expm1(x)
相比直接计算math.exp(x)-1
不会丢失过多的精度。
同样地对 进行泰勒展开:
def expm1(x):
if fabs(x) > 1e-4:
return exp(x) - 1.0
return (1.0+0.5*x)*x
可以看到这个级数收敛的很快,因此我们只要取很少的几项就能得到很高的计算精度。