首页 > 其他 > 详细

浮点数的比较

时间:2018-03-10 10:54:23      阅读:184      评论:0      收藏:0      [点我收藏+]

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

因为计算机采用有限二进制数编码,所以浮点数在计算机中的存储总是不精确的。在大量计算后一个浮点数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)等函数里。

浮点数的比较

原文:https://www.cnblogs.com/javier2018/p/8531184.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!