引进eps,来辅助判断浮点数的相等。
eps缩写自epsilon,表示一个小量,但这个小量又要确保远大于浮点运算结果的不确定量。eps最常见的取值是1e-8左右。引入eps后,我们判断两浮点数a、b相等的方式如下:
定义三出口函数如下: int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}
则各种判断大小的运算都应做如下修正:
传统意义 | 修正写法1 | 修正写法2 |
a == b | sgn(a - b) == 0 | fabs(a – b) < eps |
a != b | sgn(a - b) != 0 | fabs(a – b) > eps |
a < b | sgn(a - b) < 0 | a – b < -eps |
a <= b | sgn(a - b) <= 0 | a – b < eps |
a > b | sgn(a - b) > 0 | a – b > eps |
a >= b | sgn(a - b) >= 0 | a – b > -eps |
这样,我们才能把相差非常近的浮点数判为相等;同时把确实相差较大(差值大于eps)的数判为不相等。