码迷,mamicode.com
首页 > 其他好文 > 详细

浮点数的比较

时间:2018-03-10 11:52:52      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:sed   span   c/c++   arc   int   fine   div   fabs   定义   

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

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

浮点数的比较

标签:sed   span   c/c++   arc   int   fine   div   fabs   定义   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!