• 关于浮点数的一些问题


    在stackoverflow中看到的,之前用float类型数据比較少,所以没怎么研究。如今看看
    看看測试代码

    int main()
    {
        float a = 0.7;
        float b = 0.5;
        if (a < 0.7)
        {
           if (b < 0.5) printf("2 are right");
           else         printf("1 is right");
        }
        else printf("0 are right");
    }

    依照理论情况应该是第一个if不进入,在linux 64位上看看
    这里写图片描写叙述
    这个情况发生了,
    另一个代码
    这里写图片描写叙述
    执行结果是
    这里写图片描写叙述
    就上面两种情况分析一下。

    先看看这两种写法
    0.7和.7
    一个小代码实验

    #include<stdio.h>
    
    int main()
    {
     float a=0.7;
     printf("%zu
    ",sizeof(a));
     printf("%zu
    ",sizeof(0.7));
     printf("%zu
    ",sizeof(.7));
    
     return 0;
    }

    执行结果是
    这里写图片描写叙述
    是不是能够这样觉得。对于常值小数。os是将其默认设置为double 型的。

    上面都是一些实验现象。为了更深入理解浮点数。看看浮点数在计算机中是怎么存储和计算的。

    我们知道 对于十进制而言。
    大于0的权重是10正次幂,而小于零的是10负次幂,所以
    对于二进制小数,相同採样这个方案,
    所以这里面就会出现一个问题。对于有限长度的编码。十进制是不能表示分数的。而对于二进制小数仅仅能表示能被二整除的一些数,并不能准确的表示。仅仅能近似的表示。

    仅仅有添加二进制编码长度才会将这个误差缩小,

    IEEE是怎样将浮点数存储起来的,
    这里写图片描写叙述
    为了说明这个问题 ,採用union来查看float的存储数据

    union f
    {
     int p;
     float f;
    };
    
    int main()
    {
         union f  tf;
         tf.f=0.1;
         printf("%x
    ",tf.p);
         return 0;
    }

    这里写图片描写叙述
    0_01111011_10011001100110011001101

    所以如今已经明确一个事实就是。从正数小数到二进制小数之间的转化实际上并非全然相等的转化,是有一定误差的。对于同一个十进制小数转化成float和double因为编码位数的不一致,结果也是不同的。

    为此在比較浮点数时,採用的是误差比較法
    if (fabs(result - expectedResult) < 0.00001)
    fabs用于计算小数之间的绝对值的

    result和expectedResult是两个须要比較的浮点数

    stackoverflow的问题原地址
    http://stackoverflow.com/questions/7011184/floating-point-comparison

    以下是一个国外人写的关于浮点数的文章
    http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

  • 相关阅读:
    升级ios 不能连原本的xcode /xcode不能抓帧/换xcode版本 build fail
    BlackBerry Key2 键盘扩展
    再议C风格变量声明
    怎样去除SVN中的某个版本之前的所有版本
    mysql 常用基础语句
    乱码问题
    sql server
    MySQL查询今天、昨天、上周、近30天、去年等的数据的方法
    java 时间转换
    sql server 日期
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7008214.html
Copyright © 2020-2023  润新知