分类: C/C++
2009-12-07 11:53:37
根据IEEE的标准,浮点数的定义如下
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
我们以单精度浮点数来说明:
符号位,表述浮点数的正或者负
指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示
在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂
这个数据格式当中的,指数是8位,可表达的范围是0到255(移码表示,偏移127)
而对应的实际的指数是-127到+128
实际的小数在这个小数前面还保留了一个1
拿浮点数1.0来说
符号位是0, 实际指数是0,对应这里的指数就是127了,也就是0x7f
而小数部分就是1.0了, 1是暗含的不存储,实际的小数部分就是0了
因此组合起来的数据就是,0x3f80000
1.88 的二进制为 1.11100001010001111010111 刚好23位小数,指数0 实际存储为:3FF0A3D7,读出来还是1.88
18.8 的二进制为 10010.110011001100110011001101 = 1.0010110011001100110011001101 * 2的4次方
尾数部分28位,存储时最后5位没了,实际存储为:41966666,所以读出来就是18.799999
测试程序:
#include
int main(int argc, char* argv[])
{
float a=18.8;
printf("%f\n%08X\n%08X\n",a,&a,*(int *)&a);
return 0;
}
二进制转换方法:整数 除2取余,小数 乘2取整