关于浮点数在C语言中的存储问题?

#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;

下面是运行结果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-04
写c==2.468f就可以。
浮点数常量默认是double型。你直接写2.468会强转型。本回答被提问者和网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网