• 浮点数比较大小的问题


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

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

  • 相关阅读:
    chmod: changing permissions of ‘/etc/fstab': Read-only file system
    让Mac终端保持(SSH)与远程的连接状态
    修改数据库密码
    SSH密钥登录让Linux VPS/服务器更安全
    redis 使用redis Desktop manger进行远程进行链接
    mysql 性能
    对阿里云服务器(数据盘已分区并格式化)的数据盘进行扩容
    备份数据库的shell
    window上可以执行的shell脚本,复制到linux上执行报错了
    自然语言处理中的N-Gram模型
  • 原文地址:https://www.cnblogs.com/Ph-one/p/7612032.html
Copyright © 2020-2023  润新知