zoukankan      html  css  js  c++  java
  • 浮点数陷阱

      陷阱一

    if(0.1+0.1+0.1 == 0.3)  
        printf("equal
    ");  
    else  
        printf("not equal
    ");  

      会输出"equal"吗?不会!实际浮点数运算时,0.1+0.1+0.1 != 0.3

       陷阱二

    double i;
    for(i=0;i!=10;i+=0.1)
        printf("%.1lf
    ",i);

      程序会从0.0打印至9.9时结束循环吗?不会!因为i永远也不可能等于10,这个会无限循环

      产生上述陷阱的原因

      计算机中的所有数据都使用二进制表示的,包括浮点数,这就导致某些浮点数不能用二进制精确表示,例如0.1(这很容易理解,就像10/3=0.33333……不能被十进制精确表示一样)

      例如:

        (0.5)10 = 2-1 = (0.1)2

        (0.75)10 = 2-1 + 2-2 = (0.11)2

        (0.875)10 = 2-1 + 2-2 + 2-3 = (0.111)2

        (0.1)10 = 2-4 + 2-5 + 2-8 + …… = (0.00011001……)2

      其中0.1只能无限循环下去,这就意味着0.1在计算机中不能被精确表示,因此产生上述两个陷阱也就很容易理解,它们都涉及了不能用二进制精确表示的0.1参与运算,所以得不到预期的结果。例如陷阱二,把步长改为可以用二进制精确表示的0.5,则不会无限循环下去。

  • 相关阅读:
    使用CDN后,PHP如何获取用户的真是IP?
    git常用命令整理
    svn常用命令
    Ansible 运维自动化(一)
    grep 简单笔记
    sed 笔记
    awk命令笔记
    无限极分类(一)获得树结构
    php自定义函数求取平方根
    class path resource [config.xml] cannot be opened because it does not exist
  • 原文地址:https://www.cnblogs.com/eniac12/p/4729470.html
Copyright © 2011-2022 走看看