#include <stdio.h>
int main(){
float a,b,c;
// a = 1.345f;
// b = 1.123f;
// c = a+b;
c = 2.468f;
if(c == 2.468) //那2.468这个数字是在计算机如何来表示的呢?
printf("相等\n");
else
printf("不相等,c=%.10f,或%f\n",c,c);
return 0;
}
结果:不相等,c=2.4679999352,或2.468000
想要咨询的就是,2.468这个数字在计算机如何表达?2.468按道理讲应该和c的值在计算机中的存储是一样的呀?为什么会不同呢?
你要明白计算机内存只能存储二进制数据,因此人类习惯的十进制只能通过一定的格式进行转换,只要是转换,就有可能丢失精度.实际上大部分CPU对浮点数和双精度都是按国际规定格式操作的,而转换工作也是CPU内部的基础功能之一.听说过"XXCPU的浮点运算很强"这样的说法吧.其实这也就是在讲CPU对浮点数或者双精度进行解码编码以及运算的能力/效率.
给你段代码你可以自己调试玩玩可以帮助你理解,你可以修改fl的初始值查看各种浮点数
#define PAUSE system("pause")//这个复制到主函数外面
char c,*p1;
char *p;
float fl=-3.1415926f;
float32 *fp;
uint u,e,i;
byte b;
fp=(float32 *)&fl;
cout<<"解析浮点数"<<fl<<"在内存中的16进制编码"<<endl<<endl;
p=MemMap::ToString(fl,'x',1);
cout<<"内存中字节的存储顺序:"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::ToString(fl,'x');
cout<<"转置后的字节顺序:"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::ToString(fl,'0');
cout<<"二进制码:"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::BitMap((void *)&fl,0x80000000);
cout<<"符号的位图(1代表负数,0代表正数):"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::BitMap((void *)&fl,0x7f800000);
cout<<"阶码的位图:"<<endl<<p<<endl;
delete[]p;
e=fp->exp-127;
cout<<"提取阶码其值为:"<<fp->exp<<",译码后为:"<<fp->exp-127<<",意思为小数点向右移"<<e<<"位。"<<endl<<endl;
p=MemMap::BitMap((void *)&fl,0x007fffff);
cout<<"尾数的位图:"<<endl<<p<<endl;
delete[]p;
u=fp->m|0x00800000;//补上二进制尾数的最高位
p=MemMap::ToString ((void *)&u,4,'b');
cout<<"编码时整数的1是省略的,因此补上1,也即小数点在尾数之前:"<<endl<<p<<endl;
delete[]p;
i=u>>(23-e);
cout<<"根据阶码向右移动小数点并取出整数部分:"<<i<<endl;
i=0xffffffff;
i=i>>(32-23+e);
i=i & u;
cout<<"小数部分转十进制为:"<<abs(fl)-3<<endl;
PAUSE;
下面是运行结果:
浮点数常量默认是double型。你直接写2.468会强转型。本回答被提问者和网友采纳