| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 349 人关注过本帖
标题:浅谈浮点数在计算机的的存放
取消只看楼主 加入收藏
ylgzs
Rank: 1
等 级:新手上路
帖 子:6
专家分:6
注 册:2008-2-19
收藏
 问题点数:0 回复次数:0 
浅谈浮点数在计算机的的存放
说实话,自己水平比较菜,但为了帮助新手迅速掌握一些基本知识,只好不自量力的出来献下丑,高手可以含笑飘过,此文仅跟才入门的童鞋们讨论讨论,第一次写文章,有什么谬误请多见谅,也请多加指点

话说计算机里面数据存放都有一定的限制的,那是什么限制呢,就是数据的位数,那么限制多少位好呢,根据不同的系统和机器略有不同,至于自己的机器到底是怎么存放的,可以用printf("%d",sizeof(type))来进行测试,好了,基础概念中这点是必须要掌握的。

那么童鞋门头疼的浮点数是什么?计算机是怎么存放它的呢?下面我们就来讨论这个话题吧。

所谓浮点数并不等同于小数,带点的叫小数,计算机中的浮点类似于我们数学中的科学计数法,比如数学中的22.22*10^3,我们把前面部分叫底数,后面部分叫指数,叫法是十的3次幂,通过这样能把小数转化成浮点形式,在计算机中我们只能以二进制的形式存放,也分成底数和指数二部分,这种形式就叫浮点数。

在浮点数的表达方式中,有两种方法,一种叫规格化,那么另一种就是非规格化了,比如前面那个浮点数就是非规格化的表达方法,如果改成2.222*10^4这个形式就叫规格化,即小数点前面只有一位数字,计算机中一般以规格化的形式来存放,并且是二进制的形式,那么只能以1.1011E^0010这种形式来表达,前面只能为1,那么存放时可省掉一位,E为2,也可省掉,那么只存放后面这些数据,即只存放.1011和0010这两部分,分别叫做尾数和指数,你看多形象啊,呵呵。并且规定了总共三十二位二进制共四字节来进行尾数和指数的存放,其中最前高一位存放符号,和有符号数的方式一样,正0负1,然后次高位总共8位一字节来存放指数,这个指数范围为-126~127,咦。你不是说指数八位吗,范围应该是-128~127吧,你看得没错,理解也有深度,呵呵,但是还有两个数用于表达0.0和无穷大这类数,还有为了方便计算,实际上指数要加上127,这里我们就不讨论了。呵呵,然后低23位存放的当然是尾数啦.

浮点数是掌握了一点了,但童鞋们千万要注意,因为计算机位数有限,所以浮点数的精度也是有限的。那么我们编程的时候要避免有关精度方面的错误,比如,不用1.0*10^8和1相加,那是绝对没有效果的,虽然说逻辑语法都没错,但计算机就是不会按你想的那样做。。呵呵

说了这么多废话,下面来一实战吧

举一例:比如3.3在计算机中怎么用浮点来表示:
前面的3化为二进制自然是00000011,后面的是0.01001 1001 1001 1001 1001 1001,合在一起为11.01001 1001 1001 1001 1001 1001,移动小数点一位并取尾数23位为0.101 0011 0011 0011 0011 0011,加上一字节指数0000001,再加上正数位0,整个浮点从高到低最终为01000000 01010011 00110011 00110011,即为十六进制33 33 53 40,用下面的程序来验证下
main()
{
        float a;
        scanf("%f",&a);
        printf("a=%f,a0=%x,a1=%x,a2=%x,a3=%x",a,*(char*)&a,*((char*)&a+1),*((char*)&a+2),*((char*)
&a+3));
}

测试结果完全正确,看到这里,应该完全明白了吧
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 计算机 
2011-02-28 18:22
快速回复:浅谈浮点数在计算机的的存放
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029364 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved