在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