浮点数在内存中的表示

 C语言的float对应单精度浮点数,由1位符号、8位指数、23位尾数组成
尾数部分是二进制小数,那23位是小数点后面的部分,小数点前面还有个隐含的1并不存储
二进制小数和十进制小数道理一样,只是基数变成2
比如十进制的3.14 = 3x10**0 + 1x10**-1 + 4x10**-2 = 3 + 1/10 + 4/100
二进制的的1.00011就是1x2**0 + 0x2**-1 + 0x2**-2 + 0x2**-3 + 1x2**-4 + 1x2**-5 = 1 + 1/16 + 1/32
尾数部分可以表示1.0到2.0(不包括2.0)之间的数
有些数无法用二进制小数精确表示,就跟有些数无法用十进制小数精确表示一样
再说指数部分,指数部分表示2的多少次幂,存储时加上127,也就是说2的0次幂用127(0x7F)表示
8位指数部分可以表示的最大值是127次幂,最小值是-127次幂
最后把指数部分表示的2的那么多次幂和尾数部分相乘,就跟科学记数法一个意思
好比3.14e-2 = 3.14 x 10**-2 = 0.0314,3.14是尾数部分,-2是指数部分
IEEE格式其实就是二进制的科学记数法,尾数部分藏了个1.,指数部分加了个127
比如1.0f内部表示为0x3f800000
0 01111111 0000000 00000000 00000000
+ 1.0 x 2**(127-127) = 1
再如1.1f内部表示为0x3f8ccccd
0 01111111 0001100 11001100 11001101
+ 1.00011001100110011001101(二进制) x 2**(127-127)
= 2**0 + 2**-4 + 2**-5 + 2**-8 + 2**-9 + 2**-12 + 2**-13 + 2**-16 + 2**-17 + 2**-20 + 2**-21 + 2**-23
= 1 + 1/16 + 1/32 + 1/256 + 1/512 + ...
约等于1.1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值