浮点数是如何储存的?

「已注销」 2012-02-12 09:29:42
为什么实用浮点数的时候有时候会丢失精度?希望各位会的大神们能够详细解答一下。
...全文
337 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
proghua 2012-02-20
  • 打赏
  • 举报
回复
32位采用的是IEEE754
「已注销」 2012-02-20
  • 打赏
  • 举报
回复
明白了~~
今天老师讲了
赵4老师 2012-02-17
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
「已注销」 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 c090869 的回复:]

引用 5 楼 fengzshizhe 的回复:

引用 4 楼 arnold9009 的回复:
0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环)


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

因为 0.1=1.0/16 1.0/32 1.0/(32*16) 1.0/(32*32)........
[/Quote]分母是什么意思…?怎么来的…
「已注销」 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 c090869 的回复:]

引用 5 楼 fengzshizhe 的回复:

引用 4 楼 arnold9009 的回复:
0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环)


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

因为 0.1=1.0/16+1.0/32+1.0/(32*16)+1.0/(32*32)........
[/Quote]分母是什么意思…?怎么来的…
goodwithcode 2012-02-12
  • 打赏
  • 举报
回复
二进制、?
duyufeng1995 2012-02-12
  • 打赏
  • 举报
回复
fu点型变量在计算机内存中占用4字节(Byte),即32-bit
seucs 2012-02-12
  • 打赏
  • 举报
回复
等你学过数据在计算机中的存储方式后就自然明朗了,知识需要一点一滴的积累的
「已注销」 2012-02-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 arnold9009 的回复:]
0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环)
[/Quote]

那为什么0.1的表示形式是这样的呢?
Arnold9009 2012-02-12
  • 打赏
  • 举报
回复
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
caddor 2012-02-12
  • 打赏
  • 举报
回复
fpu,浮点数运算,在汇编中有介绍,蛮复杂的,

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

「已注销」 2012-02-12
  • 打赏
  • 举报
回复
那什么事浮点寄存器,浮点寄存器是怎样操纵的?
[Quote=引用 1 楼 ghj123h 的回复:]

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


++
[/Quote]
正在无聊中 2012-02-12
  • 打赏
  • 举报
回复
[Quote=引用 《C程序设计》]
浮点数在浮点寄存器中,以指数型是存在,前面是小数,后面是指数。
由于浮点寄存器大小有限,所以会丢失精度
[/Quote]

++
如此美丽的你 2012-02-12
  • 打赏
  • 举报
回复
看<<深入理解计算机系统>>
c090869 2012-02-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fengzshizhe 的回复:]

引用 4 楼 arnold9009 的回复:
0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环)


那为什么0.1的表示形式是这样的呢?
[/Quote]
因为 0.1=1.0/16+1.0/32+1.0/(32*16)+1.0/(32*32)........
bluewanderer 2012-02-12
  • 打赏
  • 举报
回复
float类型
最高位是符号位,后面8位是指数,最后23位是2进制有效数字的小数部分,一共32位。

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

double类型,差不多区别是指数一共11位,有效数字小数部分52位,一共64位。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧