Skip to content

避免误差危害

2025-06-29

避免小分母 ​

分母过小会造成浮点溢出,精度丢失。

避免相近两数相减 ​

相近两数之差的精度远小于此两数。

EXAMPLE

设 a=000.12345,b=000.12346,各有 5 位有效数字;而 a−00b=000.00001,只剩下 1 位有效数字。

经验性避免方法:

  1. x+ε−00x=00εx+ε+x;
  2. ln⁡(x+00ε)−00ln⁡(x)=00ln⁡(1+εx);
  3. 当 |x| 远小于 1 时,1−00cos⁡x=002sin2⁡x2;
  4. 当 |x| 远小于 1 时,ex−001=00x+0012x2+0016x3+00⋯。

避免大数吃小数 ​

精度差距太大的两数进行运算时,小数会被舍弃。

EXAMPLE

设 a=001×1016,b=001,在 IEEE 754 标准下计算 a+00b 时,在对阶过程中 b 的尾数被化成 0,导致 b 被 a「吃掉」。

减少运算次数 ​

经验性避免方法:

  1. 快速幂;

    EXAMPLE
    212=(26)2=((23)2)2=((2×22)2)2

    12 次运算 → 4 次运算。

  2. 多项式秦九韶算法。

    EXAMPLE
    a0+a1x+a2x2+⋯=a0+x(a1+x(a2+x(⋯)))

    O(n2) 次运算 → O(n) 次运算。