为了进一步了解浮点数在计算机中的存储方法。我们看看以下代码的运行结果。
#include<stdio.h>
int main( )
{
float x=123.56f;
printf("x=%f\n",x);
return 0;
}
我们希望输出x=123.56。在VC中我们编译运行该代码输出结果是:
X=123.559998
这是为什么?这就牵扯到浮点数的精度问题。我们运行以下代码看看123.56f在计算机中的存储。#include <stdio.h>
int main( )
{
unsigned char *pchar;
float x=123.56f;
pchar=&x;
printf("*(pchar+0)=0x%x\n",*pchar);
printf("*(pchar+1)=0x%x\n",*(pchar+1));
printf("*(pchar+2)=0x%x\n",*(pchar+2));
printf("*(pchar+3)=0x%x\n",*(pchar+3));
printf("x=%f\n",x);
return 0;
}
在VC中的运行结果:
我们来分析一下:0x42 0xf7 0x1e 0xb8二进制形式为:
0100 0010 1111 0111 0001 1110 1011 1000
我们按照IEEE 的内容来分析结果
0,100 0010 1,111 0111 0001 1110 1011 1000
0,符号位正数
1000 0101, 指数 133-127=6
111 0111 0001 1110 1011 1000尾数。
尾数最高位补1,1. 111 0111 0001 1110 1011 1000。因为指数是6,所以原来数据为
1. 111 0111 0001 1110 1011 1000*2^6=1111 011. 1 0001 1110 1011 1000.
=123.559998
这是为什么?这就float的精度问题,二进制小数点后权值为:2^(-n).n取值范围是1到23.
即2^(-1)+2^(-2)+2^(-3)+2^(-4)+.........,也就是0.5+0.25+0.125+0.625+.........
你可以自己动手计算一下看看24位二进制是否可以正确表达123.56F?那是不行的!
如果在程序计算中出现问题您要考虑浮点数精度问题。float可以精确到小数点后6位。其实您只要了解float数存储结构。这个也就记住了。
用户1554614 2015-11-27 11:47
用户1842699 2015-11-27 10:50
用户1554614 2015-11-13 09:22
二进制0.10001111010111000=2^(-1)+2^(-5)+2^(-6)+2^(-7)+2^(-8)+2^(-10)+2^(-12)+2^(-13)+2^(-14)=0.559998 手动计算太麻烦,在VC6.0中可以通过已下代码计算 #include #include char a[]="10001111010111000"; void main( ) { unsigned char i; double sum =0.0; printf("sum="); for( i =0 ; i< sizeof(a); i++) { if( a[i] =='1') { sum = sum + pow(2,-(i+1)); printf("+2^(%d)",-(i+1)); } } printf("\n%f\n", sum); } 不知道您明白没,希望对您有所帮助!谢谢您留言
用户1842699 2015-11-12 16:38