浮点数和数学的概念一样,在c语言中,整数是没有小数部分的数,例如2,23,3334都是整数,而3.14,0.22,2.000都不是整数在数学中它和实数的概念差不多。2.75,3,16E7,7.00都是浮点数
关键我们是要理解浮点数和整数的存储方案的不同,计算机把浮点数分成小数部分和指数部分来表示,而且分开储存的两部分,虽然7.00和7在数值上相同,但是他们的存储储存方式不同,再十进制下,可以把7.0写成0.7E1.这里0.7是小数部分 ,当然把计算机在内部使用二进制和2的幂进行存储
+ | .314159 | 1 |
符号 小数 指数 ——3.14159
以浮点格式在十进制中的存储
int main()
{ int n=9;
float *pFloat=(float*)&n;
cout<<"n的值为"<<n;
printf("*pFloat的值为%f\n",*pFloat);
*pFloat=9.0;
cout<<"n的值为"<<n;
printf("*pFloat的值为%f\n",*pFloat);
}
为何会出现这种情况呢?
举个例子
v=5.5
=(-1)^0*1.011*2^2
如果是正数那么s=0,x显然负数M表示小数E表示指数
s=0
m=1.011
E=2
IEEE 754规定
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
单精度浮点操作符
对于64位比的浮点数,最高的以为是浮点位是1位是s,剩下52位是有效数字
在IEEE754规定E必须是个无符号整数如果E是8位则取值位0~255,如果E是16位则E为11位则取值为0~2047对于8位得E,中间值为127 对于16位中间值则是1023 我们将我们得到的数字与中间值相加
当E=2时
2+128=129
表示为 10000001
用浮点表示则是
0 | 10000001 | 011 |
而题目中9用整形表示则为
0 000000000000000000000001001
在用浮点表示是则为截取32位
因为浮点位是0000000000
就是0得2进制
所以在计算机表示为2^-127次方可以忽略不计了
所以显示为0.000000
而浮点型得存储方式由于整型不同在存储01000001011中
若是整形存储则为1091567616
所以正因为存储得方式不同造成所给出的答案不同