- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浮点数及表示方法
IEEE浮点数表示法
2007年12月10日 星期一 17:36
IEEE浮点数表示法-------------------------------------------------float 共计32位(4字节)由最高到最低位分别是第31、30、29、......、0位31位是符号位,1表示该数为负,0反之30~23位,一共8位是指数位(-128~127)22~ 0位,一共23位是尾数位每8位分为一组,分成4组,分别是A组、 B组、 C组、 D组每一组是一个字节,在内存中逆序存储,即: DCBA?? 31 30??? 23 22??????????????????? 0 ?? |-|--------|-----------------------|?? | |??????? |?????????????????????? | ?? |-|--------|-----------------------|注: 尾数的存储位为23位,由于没有存储最高位的1,所以实际有效位为24位。如果其中20位都用来表示小数部分,能表示的最大值为0.999999??? 我们先不考虑逆序存储的问题,因为那样会把读者彻底搞晕,所以我先按照顺序的来讲,最后再把他们翻过来就行了。纯整数的表示方法-------------------------------------------------??? 现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数123456.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:101000000也可以这样表示:101000000.0然后将小数点向左移,一直移到离最高位只有1位:101000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样101000000 =101000000 * (2^16)现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧?(呵呵,可别拿你买的臭鸡蛋甩我),所以这个1我们还有必要保留他吗?(众:没有!)好的,我们删掉他。这样尾数的二进制就变成了:01000000 最后在尾数的后面补0,一直到补够23位:01000000 0000000 (MD,这些个0差点没把我数的背过气去)??? 再回来看指数,一共8位,可以表示范围是0 ~ 255的无符号整数,也可以表示-128~127的有符号整数。但因为指数是可以为负的,所以为了统一把十进制的整数化为二进制时,都先加上127。??? 在这里,我们的16加上127后就变成了143,二进制表示为:??? 123456.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来:0111000100000000再转化为16进制为:47 F1 20 00,最后把它翻过来,就成了: 00 20 F1 47输出4个字节的浮点数内存数据-------------------------------------------------#include stdio.hint main(){??? float f = 123456.0;??? unsigned char * c = (char *)f;??? int i = 0;??? for (i = 3; i = 0; i--)??????? printf(%p\n, c[i]);}0x470xf10x20(nil)整数和小数混合的表示方法-------------------------------------------------??? 有了上面的基础后,下面我再举一个带小数的例子来看一下为什么会出现精度问题。??? 按照IEEE浮点数表示法,将float型浮点数123.456f转换为十六进制代码。对于这种带小数的就需要把整数部和小数部分开处理。整数部直接化二进制: 1111011。小数部的处理比较麻烦一些,也不太好讲,可能反着讲效果好一点,比如有一个十进制纯小数0.57826,那么5是十分位,位阶是1/10;7是百分位,位阶是1/100;8是千分位,位阶是1/1000 ...,这些位阶分母的关系是10^1、 10^2、 10^3...,现假设每一位的序列是{S1、 S2、 S3、 ...、
文档评论(0)