浮点数比较大小的问题

浮点数比较大小,由于精度问题,所以直接比较有时可能会出错。

单精度数7位有效数字。 (float)
双精度数16位有效数字。(double)

单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位

单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为 2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)

单精度数7位有效数字。

双精度数16位有效数字。 
浮点数取值范围: 
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。 
双精度数取值范围: 
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。


所以在比较的时候需要用一个很小的数值来进行比较。(二分法的思想)当二者之差小于这个很小的数时,就认为二者是相等的了。这个很小的数,称为精度。
精度由计算过程中需求而定。比如一个常用的精度为1e-6.也就是0.000001.
所以对于两个浮点数a,b,如果要比较大小,那么常常会设置一个精度
如果fabs(a-b)<=1e-6,那么就是相等了。 fabs是求浮点数绝对值的函数。
类似的 判断大于的时候,就是if(a>b && fabs(a-b)>1e-6)。

判断小于的时候,就是if(a<b&&fabs(a-b)>1e-6)。

例如:

 
  1. #include<cstdio>

  2. #include<cmath>

  3. const double esp = 1e-6;

  4. int main()

  5. {

  6. double a,b;

  7. scanf("%lf %lf",&a,&b);

  8. if(fabs(a - b) <= esp)

  9. printf("ok\n");

  10. else

  11. printf("no\n");

  12. return 0;

  13. }

如有错误,还请指正,O(∩_∩)O谢谢

猜你喜欢

转载自blog.csdn.net/wangkeyen/article/details/81842775