笔记1:浮点数的比较

  在计算机中采用有限位的二进制编码,因此浮点数在计算机中的粗出并不总是精确的。如在经过大量计算后,一个浮点型的书3.14在计算机中就可能存储成3.1400000000001或3.1399999999999,这种情况下会对比较操作带来十分大的干扰(因为c/c++中的“==”操作是完全相同才能判定为true)。因此在浮点数的比较是要引入一个极小的eps来对这种误差进行修正,经验表明当eps取10^(-8)时比较合适(const double eps=1e-8;)。

1.等于运算符(==)

                  

  如图,如果一个数a落在了[b-eps,b+eps]的区间中时,就应当判断a==b的情况成立,通常我们将比较操作写成宏定义操作:

 1 #include<cstdio>
 2 #include<cmath>
 3 const double eps=1e-8;
 4 #define Equ(a,b) (fabs((a)-(b))<(eps))
 5 int main()
 6 {
 7     double db=1.23;
 8     if(Equ(db,1.23))
 9     {
10         printf("true");
11     }
12     else
13     {
14         printf("flase");
15      } 
16      return 0; 
17  } 

运行结果如图:

2.大于运算符(>)

                  

  如图,如果一个数a要大于b,那么就比喻在误差eps的扰动范围之外大于b,因此只有大于b+eps的才能判断为大于b(即a-b大于eps):

#define More(a,b) (((a)-(b))>(eps))

3.小于运算符(<)

                     笔记1:浮点数的比较_第1张图片 

   如图,如果一个数a要小于b,那么就必须在误差eps的扰动范围之外小于b,因此只有小于b-eps的书才能判定为小于b(即a-b小于-eps):

#define Less(a,b) (((a)-(b))<(-eps))

4.大于等于运算符(>=)

                      笔记1:浮点数的比较_第2张图片

  如图,大于等于可以理解为大于运算符和等于运算符的结合,因此我们需要让一个数a在误差扰动范围内能够判定为其大于或者等于b,故大于b-eps的数都应当判定为大于等于b(即a-b大于-eps):

#define MoreEqu(a,b) (((a)-(b))>(-eps))

5.小于等于运算符(<=)

                        

  如图,小于等于可以理解为小于运算符和等于运算符的结合,因此我们需要让一个数a在误差扰动范围内能够判定为其小于或者等于b,故小于b+eps的数都应当判定为小于等于b(即a-b小于eps)

#define LessEqu(a,b) (((a)-(b))<(eps))

6.圆周率(π)

  在涉及到浮点数的程序中经常要用到圆周率π,因为cos(π)=-1,可得π=arccos(-1),因此我们只需要把π写成常量acos(-1.0)即可:

const double PI=acos(-1.0);

 

 

 

ps:本博客中的知识点和图片全部来自于书《计算机考研复试上机指导全书》

 

你可能感兴趣的:(笔记1:浮点数的比较)