首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

浮点数是怎么储存的

2012-04-10 
浮点数是如何储存的?为什么实用浮点数的时候有时候会丢失精度?希望各位会的大神们能够详细解答一下。[解决

浮点数是如何储存的?
为什么实用浮点数的时候有时候会丢失精度?希望各位会的大神们能够详细解答一下。

[解决办法]

引用 《C程序设计》
浮点数在浮点寄存器中,以指数型是存在,前面是小数,后面是指数。
由于浮点寄存器大小有限,所以会丢失精度

[解决办法]
fpu,浮点数运算,在汇编中有介绍,蛮复杂的,

汇编一般先将整形,后将 浮点数


[解决办法]
lz看一下IEEE754浮点数标准吧


IEEE规定的浮点数的机器表示:

32位机器的 float 是4字节的,共32位。
第1位是符号位,接着8位指数位,接着23位基数位。
以5.1为例。

5 = 101 (2进制)

0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环)

所以 5.1 = 101.0 0011 0011 0011 0011 0011 0011 0011 0011 ...

5.1= 1.010 0011 0011 0011 0011 0011 0011 0011 0011 0011... * 2^2

因为第一位总是为1,如果是0,就移动小数点直到是非0的,所以第一位的1丢弃。
得到 010 0011 0011 0011 0011 0011 0011 0011 0011....
取23位 得到 0100 0110 0110 0110 0110 011

接着看指数部分
指数是2, 根据规定,指数统一+127再转换为无符号8位2进制数,
2+127=129 (1000 0001)

存储的时候指数部分存储在基数之前,这样就有31位了,
因为5.1是正的,所以符号为是0,存储在指数部分之前

这样就得到 0100 0000 1010 0011 0011 0011 0011 0011
[解决办法]
float类型
最高位是符号位,后面8位是指数,最后23位是2进制有效数字的小数部分,一共32位。

符号位0表示正数,1表示负数。指数表示有效数字要乘以2的多少次方,127表示0次方,126表示-1次方,128表示1次方,0是无穷小,255是无穷大。有效数字整数部分永远是1,所以省略,加上23位小数部分一共24位有效数字。

double类型,差不多区别是指数一共11位,有效数字小数部分52位,一共64位。
[解决办法]
探讨

引用:
0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环)


那为什么0.1的表示形式是这样的呢?

[解决办法]
看<<深入理解计算机系统>>
[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。

[解决办法]
32位采用的是IEEE754

热点排行