zoukankan      html  css  js  c++  java
  • 浮点数比较大小的问题

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

    单精度数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)。

    例如:

    #include<cstdio>  
    #include<cmath>  
    const double esp = 1e-6;  
    int main()  
    {  
        double a,b;  
        scanf("%lf %lf",&a,&b);  
        if(fabs(a - b) <= esp)  
            printf("ok
    ");  
        else  
            printf("no
    ");  
        return 0;  
    }  

    原文:http://blog.csdn.net/liujian20150808/article/details/50630546

  • 相关阅读:
    4.2 面向对象分析(二) CRC方法标识概念类
    4.1 面向对象分析(二) 标识概念类和对象
    3.4 面向对象分析(一)面向对象设计(初步)
    3.3 面向对象分析(一)分析模型法
    3.2 面向对象分析(一)名词法
    3.1 面向对象分析与设计概览
    2.7 UML状态图
    2.6 通信图
    2.5 UML顺序图
    2.4 UML类图
  • 原文地址:https://www.cnblogs.com/Ph-one/p/7612032.html
Copyright © 2011-2022 走看看