C语言中浮点数的存储

文章目录

    • 简述
    • 浮点数的解释
    • 浮点数的存储过程
    • 浮点数的转换过程
    • 浮点数的存储过程
    • 浮点数注意事项

简述

大部分人会认为浮点数与整数的存储没有区别,就是按字节排序存储。事实与人们认为的不同,超乎我们的认知,不禁感叹前人的智慧,接下来我们就来一同揭开这"浮点数存储"的“面纱”....

浮点数的解释

浮点数:指小数点位置可浮动的数据

(1) 单精度浮点数(32位),阶码8位,尾数24位(内含1位符号位)。
(2) 双精度浮点数(64位),阶码11位,尾数53位(内含1位符号位)。

浮点数的存储过程

浮点数大致可以用一个公式写出:N=(-1)^S*M*2^E

1.N是浮点数

2.(−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数

3.M 表⽰有效数字,M是⼤于等于1,⼩于2的

4.2 E 表⽰指数位

浮点数存储分为float浮点数存储和double浮点数存储:

1.float浮点数存储类型:S为一个字节,E为8个比特位,M为23个比特位。例图如下:

2.double浮点数存储类型:S为一个字节,E为11个比特位,M为52个比特位。例图如下:

浮点数存储过程中的特别规定:
1.IEEE 754 对有效数字M和指数E,还有⼀些特别规定。

1<M<2,所以M为1.xxxxxx,xxxxxx为小数部分。

每次在存储的过程中都会存储这个1,因此在存储过程中只会存储小数部分,省略了1。等到读取数据的时候再在第一位加上1,这样子可以节省1个位置,给浮点数存储更精确。

2.E的存储

E为一个无符号整数,如果E为8位,存储的数据为0~255,如果E为11位,它的取值范围为0~2047。IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

浮点数转换过程

我们以9.0为例:

9.0转换为二进制:1001.0 转换为科学计数法:1.001×2^3

所以: 9.0  =  (−1)   ∗ 0  (1.001)  ∗  23 ,那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130, 即10000010

所以,写成⼆进制形式,应该是S+E+M,即:0 100000010 001 0000 0000 0000 0000 0000 0000,这个32位的⼆进制数,被当做整数来解析的时候,就是整数在内存中的补码,原码正是 1091567616 。

浮点数读取过程

指数E的取出分为三个情况:

1.E不全为1或者不全为0:

这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。

2.E为全0:

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。

3.E为全1:

这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)。

浮点数注意事项

1.因为浮点数的存储位数是有限的,所以浮点数存储的精度也是有限的,无法做到高精度。

2.浮点数不能存储特殊数字,例如3.14、0.445等,这些数字难以转换为二进制,转换之后的存储位数很多,无法精确存储和读出。

 以上是本人的个人心得,如有错误的地方,请大佬多多指教!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值