关于浮点数的一些问题

在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

原文地址:https://www.cnblogs.com/yjbjingcha/p/7008214.html