0. 数值分析
数值分析(计算数学)观点,如下两种最常见的浮点数运算过程中损失有效数字的情况。
- 两个相近的数相减
- 两个数量级相差很大的数字相加减
1. limx→0log(1+x) lim x → 0 log ( 1 + x ) (两个数量级相差很大的数字相加减)
- 计算 log(1+x) log ( 1 + x ) ,Python math 库中有专门的函数,math.log1p(plus 1)。
- 从计算机数值计算的角度,当
x
x
逼近 0 时,
math.log1p(x)
比直接计算math.log(x)+1
不会丢失过多的精度。
math.log1p 的实现原理基于 的泰勒展开:
log(1+x)=x−x22+x33−x44+x55+⋯
log
(
1
+
x
)
=
x
−
x
2
2
+
x
3
3
−
x
4
4
+
x
5
5
+
⋯
def log1p(x):
if fabs(x) > 1e-4:
return log(1.0+x)
return (1.0-x*0.5)*x
2. limx→0exp(x)−1 lim x → 0 exp ( x ) − 1 (两个相近的数相减)
- 计算 exp(x)−1 exp ( x ) − 1 ,Python math 库中有专门的函数,math.expm1(minus 1)。
- 从计算机数值计算的角度,当
x
x
逼近于0时,
math.expm1(x)
相比直接计算math.exp(x)-1
不会丢失过多的精度。
同样地对 进行泰勒展开:
ex−1=x+x22+x36+x424+x5120+⋯
e
x
−
1
=
x
+
x
2
2
+
x
3
6
+
x
4
24
+
x
5
120
+
⋯
def expm1(x):
if fabs(x) > 1e-4:
return exp(x) - 1.0
return (1.0+0.5*x)*x
可以看到这个级数收敛的很快,因此我们只要取很少的几项就能得到很高的计算精度。