浮点型只能近似的表示某个实数
浮点型在内存的存储方式与整型不一样
float:3.25 32位
符号位:1位 0 s
指数位:8位 1000 0010 E
小数位:23位 000 0100 0000 0000 0000 0000 M
(-1)^s*2^(E-127)*1.M E:0-254
8 * 1.03125 = 8.25
由此就证明了:浮点型数据在内存中与整型存放的方式不一样
导致的结果:浮点型数据不能准确的表示某个实数,只能近似表示
笔试题:
有一个float类型的a,写代码判断a和0是否相等?
if(0 == a) error-->a只能近似等于0
if(a >= -e-6 && a <= e-6)
{
printf("a == 0\n");
}
精度范围:6-7位
double:64位
符号位:1位
指数位:11位
小数位:52位
精度范围:15-16位
参考链接
三、正浮点型
浮点型中有两种,一种是4Byte的float型,一种是8Byte的double型,这两种计算方式都一致,只是有点点区别
1、float型:
float型是遵循IEEE R32.24规范,即1位符号位、8位阶码、23位尾数
具体计算方式是先用科学计数法表示出该数的二进制,然后计算出阶码值,最后把尾数 补足23位,依此存储
比如125.5这个数
先看整数部分,125表示成二进制是1111101,(整数转换二进制是除二取余)
再看小数部分,0.5表示成二进制是0.1,(小数转换二进制是乘二取整)
所以125.5用二进制表示就是1111101.1,转换成科学计数法就是1.1111011 x 2^6(阶数为6)
但是这里的阶码是用移码的形式表示,float型的偏置量是127,于是6+127=133,即10000101
这里前面的9位就出来了,因为是正数,所以符号位为0,阶码为10000101
后面的尾数就是1111011,在后面补0,凑齐23位,即 1111011 00000000 00000000(因为科学计数法的整数部分总是为1,所以,这个1不用存储)
所以125.5的存储方式为 0 10000101 11110110000000000000000
即: 01000010 11111011 00000000 00000000
2、double型
double型跟float型计算方式类似,不过区别在于double型遵循IEEE R64.53规范
a、double的符号位是1位,阶码为11位,尾数为52位
b、double的偏置量是1023,而float是127
四、负浮点型
和上面一样,不过就是符号位用1表示,就这点小区别