经典:浮点数的存储方式 float

经典:浮点数的存储方式 float

ID:12530328

大小:66.00 KB

页数:4页

时间:2018-07-17

经典:浮点数的存储方式 float_第1页
经典:浮点数的存储方式 float_第2页
经典:浮点数的存储方式 float_第3页
经典:浮点数的存储方式 float_第4页
资源描述:

《经典:浮点数的存储方式 float》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、int和float都是4字节32位表示形式。为什么float的范围大于int?float精度为6~7位。1.66*10^10的数字结果并不是16600000000指数越大,误差越大。这些问题,都是浮点数的存储方式造成的。   float和double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEER32.24,而double遵从的是R64.53。   无论是单精度还是双精度在存储中都分为三个部分:1.符号位(Sign):0代表正,1代表为负2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储3.尾数部分(Mantissa):尾数部分其中flo

2、at的存储方式如下图所示:而双精度的存储方式为:      将一个float型转化为内存存储格式的步骤为:     (1)先将这个实数的绝对值化为二进制格式。     (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。     (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。     (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。     (5)如果n是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。     (6)如果n是左移得到的,则将n减去1后化为二进制,并在左

3、边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。    R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*,而120.5可以表示为:1.205*,计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为1.0001*,1110110

4、.1可以表示为1.1101101*,任何一个数都的科学计数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存

5、中真正的存储方式。    首先看下8.25,用二进制的科学计数法表示为:1.0001*按照上面的存储方式,符号位为: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位(当

6、30位是“0”时)或右移n位(当30位是“1”时),得到一个二进制表示的实数。     (4)将这个二进制实数化为十进制,并根据第31位是“0”还是“1”加上正号或负号即可。那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据:0100001011101101000000000000,首先我们现将该数据分段,010000010111011010000000000000000,在内存中的存储就为下图所示:根据我们的计算方式,可以计算出,这样一组数据表示为:1.1101101*=120.5而双精度浮点数的存储

7、和单精度的存储大同小异,不同的是指数部分和尾数部分的位数。所以这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果           floatf=2.2f;           doubled=(double)f;           Console.WriteLine(d.ToString("0.00000

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。