先从一个例子出发:
#include <stdio.h>
void main()
{
float f = 0.01;
char s[32+1];
int i;
unsigned int c = *((unsigned int*)&f);
for(i=0;i<32;i++) {
s[31-i]=(char)(c&1)+'0';
c>>=1;
}
s[i] = '\0';
printf("s=%s\n", s);
}
输出结果为:s=00111100001000111101011100001010
这是一个2进制字符串, 第一位为0表示这个浮点数为正。
接下来的8bit取反后存的是指数值,~(01111000) = 10000111 = -7
最后的32-1-8 = 23bit为尾数: 01000111101011100001010
等价于:1+1/4+1/64+1/128+1/256+1/512+1/2048+1/8192+...
注意:这里第1为1不存入内存, 1/4, 1/64等对应于2进制的
1/(n+1), n为序号。
(1+1/4+1/64+1/128+1/256+1/512+1/2048+1/8192+...) *2^(-7) = 0.01
其实这个值也不会很准,但很接近0.01了。
从上面的例子中可以看出, 针对m*2^n(m,n为整数)的浮点数,比如0.5, 0.75, 0.125, 4.0, 256.0等可以精确的表示,
而其它浮点数则只能是一个比较接近的值了。
d为浮点类型
if (0.75 == d) // 可以比较
if (0.8 == d) //不可以比较