- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
float浮点数的二进制存储方式及转换int和float都是4字节32位表示形式为什么float的范围大于int?
float精度为6~7位1.66×10^10的数字结果并不是166 0000 0000指数越大,误差越大。
这些问题,都是浮点数的存储方式造成的。?float和double在存储方式上都遵从IEEE的规范float遵从的是IEEE R32.24而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
符号位(Sign)0代表正,1代表为负
指数位(Exponent)用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为
附注:将一个float型转化为内存存储格式的步骤
(1)先将这个实数的绝对值化为二进制格式。
(2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。?(3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。?(4)如果实数是正的,则在第31位放入“0”,否则放入“1”。?(5)如果n 是左移得到的,说明指数是正的,第30位放入“1”如果n是右移得到的或n=0,则第30位放入“0”。?(6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25×而120.5可以表示为1.205×计算机根本不认识十进制的数据,只认识01,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.1,120.5用二进制表示可表示为1110110.1我靠不会连这都不会转换吧那我估计要没辙了用二进制的科学计数法表示1000.1可表示为1.0001×2^3,而1110110.1则可表示为1.1101101×任何一个数的科学计数法都表示为1.xxx×尾数部分就可表示为xxx第一位都是1嘛,干嘛还要表示呀?可将小数点前面的1省略,23bit的尾数部分,可以表的精度却变成了24bit道理就是在这里那24bit能精确到小数点后几位呢我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为-12128了,所以指数部分的存储采用移位存储,存储的数据为数据127,下面就看看8.25和120.5在内存中真正的存储方式。
???? 首先看下8.25,用二进制的科学计数法表示为1.00001×2^3。按照上面的存储方式,符号位为0,表示为正指数位为3+127=130数部分为故8.25的存储方式如下图所示
而单精度浮点数120.5的存储方式如下图所示
附注:将一个内存存储的float二进制格式转化为十进制的步骤:(1)将第22位到第0位的二进制数写出来,在最左边补一位1,得到二十四位有效数字。将小数点点在最左边那个1的右边。(2)取出第29到第23位所表示的值n当30位是0时将n各位求反当30位是1时将n增1。(3)将小数点左移n位(当30位是0时)或右移n位(当30位是1时),得到一个二进制表示的实数。(4)将这个二进制实数化为十进制,并根据第31位是0还是1加上正号或负号即可。
那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据0100001011101101000000000000,首先我们现将该数据分段,0 10000 0101 110 1101 0000 0000 0000 0000,在内存中的存储就为下图所示:
根据我们的计算方式,可以计算出,这样一组数据表示为1.1101101*2^6=120.5
而双精度浮点数的存储和单精度的存储大同小异不同的是指数部分和尾数部分的位数。所以这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的
下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果
??????????? float f = 2.2f;??????????? double d = (double)f;??????????? printf(%.13f\n,d);??????????? f = 2.25f;??????????? d = (double)f;?????
文档评论(0)