IEEE754 浮点数-学习过程.

来源:互联网 发布:网络出版发展 编辑:程序博客网 时间:2024/05/16 19:18
----------------------------------------
author:hjjdebug
date: 2017年 11月 14日 星期二 13:50:31 CST
----------------------------------------

1. 先来聊聊浮点,它是相对于定点来说的.
定点数来表示实数是这样做的:
对于一个32bits的数据,定义一部分bits表示整数,另一部分bits表示小数,小数点的位置不能动.
这样的表示方法简单倒是简单,但是,定义整数多了,小数部分就少了,定义小数部分多了,整数部分就少了,
而且表达的数据范围有限. 显然,问题出在小数点,小数点的位置固定.如果小数点位置不固定,大整数小数点
右移,小整数小数点左移,让出更多的位给小数,该多好啊.

虽然没有上述的浮点数,但却有一个科学计数法表示的更好的浮点数,
它能表示更大的数据范围,小数点可以浮动理论上是256个位置,但是,数据的准确度就要打点折扣了.
规格化的科学计数法是这样的. 把一个数表达成a*2^b, 其中1<=a<2
我们把32bits数据划分为三个部分,
SEEEEEEE   EMMMMMMM    MMMMMMMM    MMMMMMMM
2. 最高位表示符号位,0为正,1为负. 这个很简单,没什么好说的.

3. 后面的8bits表示指数幂b,  表示的数据范围当然是0-FF了,
想了解IEEE754标准,当然要先找一个IEEE754标准的浮点数到二进制的转化器了.
输入2,->2^1  指数部分显示了0x80
输入4,->2^2  指数部分显示了0x81
输入8,->2^3  指数部分显示了0x82
输入1,->2^0  指数部分显示了0x7F
我为什么按则个顺序写,我就是到最后才忽然认识到指数的0x7F对应幂的0次方!
...
256 -> 2^8  应该显示0x7f+8 = 0x87 ,实验一下,正是!
输入0.5,->2^(-1),  指数部分显示了0x7E
输入0.25,->2^(-2),  指数部分显示了0x7D
输入0.125,->2^(-3),  指数部分显示了0x7C

我们输入0.0,指数部分,符号位,尾数部分显示的全是0.

0是最小的小数了,指数0也代表了最小的幂.尾数全0代表a是1,符号为0代表正数.

它用全0表达了0这个特殊的值.也符合我们的习惯
另外,指数部分为全1 0xFF 也是一个特例,用来表示特殊的含义.最大的指数是0xFE
表示的是2^127次方,127的来历是0xFE-0x7F=0x7F=127

这里指数减0x7F叫移码,为什么要移码?
因为我们既要表示一个很大的整数,又要表示一个很小的小数
大于1的整数幂大于0, 我们用0x7f->0xff 表示, 其中0x7F是个特殊值0不用,0x80为1
小于1的小数其幂小于0,是个负数,我们用0x0->0x7E 表示, 其中0x7E表示指数为-1
例如0.5->2^(-1)  (-1) -> 0x7E
这样0x0 代表的指数幂是0x7F=127
所以为什么要移码,是因为小的幂代表的是负指数,0x7f代表0指数,0x80代表1指数

小结: 幂部分8bit, 0-7F表示负的指数幂,0x7F表示0次幂, 0x7F-0xFE表示正的指数幂

0xFF特殊用途. 它并不具体指某一个数,这个特殊的意义可以由用户自己定义.

 
4. 最后看看23bits表示的因数a.
在计算器中输入3,构造一个2^1+2^0=2*(1+0.5)
在计算器中输入7,构造一个2^2+2^1+2^0=4*(1+0.5+0.25)
在计算器中输入14,构造一个2^3+2^2+2^1+2^0=8*(1+0.5+0.25+0.125)
我们知道,原来最高为bit23代表0.5, bit22代表0.25, bit21代表0.125....
bit0代表了2^23分之一, 最后一位是不准的,是用4舍五入法或者向偶数对齐法取得的,
再小的数位只能忽略.