浮点数比较精度问题
今天被浮点数精度问题关了小黑屋,整理了一下两个浮点数的任意比较形式
eps
eps缩写自epsilon,表示一个小量,但这个小量又要确保远大于浮点运算结果的不确定量。
eps最常见的取值是1e-8左右。引入eps后,我们判断两浮点数a、b相等的方式如下:
定义三出口函数如下:
double eps = 1e-8;
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