如果 p ∗ p^* p∗是p的近似, ∣ p ∗ − p ∣ |p^*-p| ∣p∗−p∣是绝对误差, ∣ p ∗ − p ∣ / ∣ p ∣ |p^*-p|/|p| ∣p∗−p∣/∣p∣是相对误差
舍入误差,就是数据表示精度不足带来的误差
a=0.1234564≈0.123456=fl(a)
b=0.1234546≈0.123455=fl(b)
在上面发生了舍入误差
fl(a)-fl(b)=0.000001
a-b=0.0000018
所以在计算a-b时绝对误差是0.0000008
但是想对误差是0.44
从绝对误差的角度看,差异很小,但是从相对误差的角度来看误差就非常大了
大数吃小数:
如果精度有限可能会发生下面的情况
100000000
+
0.5
=
100000000
100000000+0.5=100000000
100000000+0.5=100000000
100000000
+
0.5
−
100000000
=
0
100000000+0.5-100000000=0
100000000+0.5−100000000=0
(
100000000
+
0.5
−
100000000
)
∗
100000000
=
0
(100000000+0.5-100000000)*100000000=0
(100000000+0.5−100000000)∗100000000=0
这和真实结果差了很多,因为精度不够,大数加小数的时候把小数吃掉了,导致后续结果都出现问题,一个办法是交换顺序
100000000
−
100000000
=
0
100000000-100000000=0
100000000−100000000=0
100000000
−
100000000
+
0.5
=
0.5
100000000-100000000+0.5=0.5
100000000−100000000+0.5=0.5
(
100000000
−
100000000
+
0.5
)
−
100000000
=
50000000
(100000000-100000000+0.5)-100000000=50000000
(100000000−100000000+0.5)−100000000=50000000