赞
踩
IEEE754标准的介绍网上有好多,这里就不过多介绍了,这篇文章主要讲的是浮点数转换的方法,大家认真看马上就能掌握了
但是我们还需需要了解
计算机存储的方式主要有两种,分别是定点数和浮点数
那存储的内存就那么多,怎么样才能存储更多的位数呢?
科学家们就很聪明,通过科学计数法来创造了浮点数的存储
好,说了那么多,感兴趣了了解一下就行
那么需要我们记住的是,定点数存储的范围小,但是精确;浮点数存储的范围更大,但是不精确
一个浮点数 (Value) 的表示其实可以这样表示:
也就是浮点数的实际值,等于符号位(sign bit)乘以指数偏移值(exponent bias)再乘以分数值(fraction)。
哈哈,有点难,我也看不懂
那我们看这个
我们可以这样理解,任何一个二进制数,都可以表示为
这个要怎么理解呢,看上面那幅图十进制的1.75转化为二进制的表示
当然上面那幅图指数是二进制,实际上我们写的时候写成十进制可能更好去理解,那
十进制是 小数X10的几次方
二进制当然就是 小数X2的几次方
理解的方式自然也是一样的,乘上正数次方,小数点向右移动,乘上负数次方,小数点向左移动。
我们有三十二位地址,也就是4byte(32bit)
如果大家感兴趣后面单独出一个文章来讲32位和64位到底是什么意思
那该如何存储呢?
IEEE754规定:在32位浮点数中,符号位为第一位,指数位是后面八位,小数位是后面的23位
0为“+”,1为“-”,也就是说第一位是0,就说明这个数是个正数,第一位是1,就说明是负数
如何去记呢
很简单,因为0就说明什么也没有,所以如果是正数的话我们不会过多去关注,是负数我们才需要去标记一下,也就是在前面加上1.
在 IEEE 754 浮点数标准中,阶码是用移码表示的,移码的定义:移码 = 真值 + 偏置值;
在 IEEE 754 标准中,移码的偏置值是 2^(n-1)-1
这个是什么意思呢,其实也很简单,我们需要的是真值,根据上面的式子很容易就能得出:
真值 = 移码 - 偏置值
所以在三十二位浮点数中,阶数(指数)一共有八位,所以真正的指数就可以表示为
真正的指数 = 32位浮点数从前往后第二位到第九位的二进制数 - 2^(8-1)-1
再算一下
指数 = 八位阶数 - 127
小数位,大家可以思考一下,如果必须开头都是1,那么我们是不是可以从第二位开始储存,第一位默认为1,以此来获得更大的存储空间呢?
在 IEEE 754 浮点数标准中,尾数码部分采用原码表示,且尾数码隐含了最高位 1,在计算时我们需要加上最高位1,即 1.M
介绍了那么多,接下来我们来一起看看实战的例子
IEEE754标准格式存储的十六进制浮点数转换成十进制的数值
41360000
首先,我们先把十六进制转化为2进制,十六进制,每一位都能转化成4位二进制,就比如说4能转化成0010,1能转化成0001,分别写出来连起来就好
0 100 0001 0 011 0110 0000 0000 0000 0000
我们按照上面讲的,把32位浮点数划分为1、8、23,三组数字,然后一组一组看
符号位:0
表示32位浮点数是一个正数
指数位(阶码):1000 0010
转化成十进制,2的7次方加上2的1次方,为130
注意:此时的130为移码,指数的真值为移码减去偏置值
也就是 130 - 127 = 3
小数位(尾数):011 0110 0000 0000 0000 0000
因为尾数储存的时候省略了1,所以这个数应该看作
1.011011
好的,那么这个浮点数三个部分我们都知道了,那么组合起来就是这个数的十进制数值
理解起来很简单,就是正数,二进制数乘上2的3次方,和科学计数法一样,正3次方,小数点往后移动三位就行,表示出来就是
1011.011
那么,转化为十进制
= 11.375
所以11.375就是最终的结果
十进制化为二进制浮点数表示就是把整体逻辑反过来了,这里就不举例子了
形式 | 指数 | 小数部分 |
---|---|---|
零 | 0 | 0 |
非规约形式 | 0 | 非0 |
规约形式 | 1到 | 任意 |
无穷 | 0 | |
NaN | 非零 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。