浮点数的比较

Posted javier2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浮点数的比较相关的知识,希望对你有一定的参考价值。

浮点数的比较困扰了我很久,今天终于看到了解决办法在此分享一下。

因为计算机采用有限二进制数编码,所以浮点数在计算机中的存储总是不精确的。在大量计算后一个浮点数1.18可能在计算机中就会变为1.18000000000001或者1.17999999999999,在这种情况下c/c++使用“==”操作必须是完全相同才能是true,因此必须引入一个最小量eps作为修正。经验表明eps一般取10-8

所以我们写程序的时候就可以这样:

const double eps = 1e-8;
#define Equ(a,b) ((abs((a)-(b)))<(eps))

举个例子:

技术分享图片
#include<cstdio> 
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-8;
#define Equ(a,b) ((fabs((b)-(a)))<(eps))
int main(){
    double a = 1.23;
    if(Equ(a,1.23)){
        printf("T");
    }else{
        return 0;
    }
}
View Code

特别说一下大于等于的做法。

设一个浮点数 a ∈(a-eps,a+eps)那么另一个浮点数b要大于等于a,则b>a-eps,所以b-a>-eps。

技术分享图片
 1 #include<cstdio> 
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 const double eps = 1e-8;
 6 #define MoreEqu(a,b) ((fabs((b)-(a)))>(-eps))
 7 int main(){
 8     double a = 1.23;
 9     if(MoreEqu(a,1.23)){
10         printf("T");
11     }else{
12         return 0;
13     }
14 }
View Code

 

再说一个关于圆周率的表示。

因为cosπ = -1,所以π = arccos-1

const double pi = acos(-1.0);

最后有一点要注意,经过了大量的运算0.00可能是一个负数即-0.00,这时要是使用sqrt()函数就会出错,这时就要加上一个eps保证你要运算的数在定义域内。同样的问题也适用于arcsin(+1)和arcsin(-1)等函数里。

以上是关于浮点数的比较的主要内容,如果未能解决你的问题,请参考以下文章

内部格式为 GL_RGBA8 的纹理在片段着色器中显示为浮点数

比较浮点数的总和[重复]

golang比较浮点数是不是相等

如何在perl中比较浮点数而不只是相等

浮点数的比较

js实现浮点数保留两位小数代码