·咱们知道,在 十进制中一般一个浮点数能够用科学计数法来表示,举例:spa
eg.1 -306.5能够表示为-0.3065*10^3orm
其中 - 是符号,指数3是阶或称阶码,0.3065是小数部分,左右两端非0包起来的部分是有效值,此例中的有效值是3065。因为小数部分也称为尾数,因此3065也是尾数。it
eg.2 -3.87效率
其中,有效值为387,尾数为87基础
·为何称为浮点数呢?原理
由于他能够表示为 -3.065*10^2 也能够表示为 -0.03065*10^4 等,小数部分能够左右“浮动” ,但无论小数部分怎么移动,其有效值保持不变,都是3065(注意:尾数是变化的)。因而,两个浮点数相加就先要经过小数点的左右浮动,将阶码对齐后进行尾数相加。二进制
(当阶码为固定值时,数的这种表示法称为定点表示,这样的数称为“定点数”;当阶码为可变时,数的这种表示法称为浮点表示,这样的数称为“浮点数”。)im
·十进制浮点数规格化img
为了使有效值和尾数可以统一,在空间上表达更有效率,有必要将全部浮点数规格化。计算机
规格化标准:经过调整阶码将浮点数写成小数点前不含有有效数字,小数点后第一位由非0数字表示,举例-306.5规格化为-0.3065*10^3。
在计算机内部,浮点数都是以二进制表示的。因此对于十进制浮点数,咱们要把它先转换为二进制浮点数。
分两步走:
a.整数部分的转换,采用"除2取余法"。
b.小数部分采用"乘2取整法"。即把小数部分乘2(第一次计算),所得结果的整数部分做为小数的十分位,所得结果的小数部分再乘2(第二次计算),第二次计算所得结果的整数部分做为小数的百分位...以此类推,直到达到所需精度。
当十进制浮点数转换完成二进制浮点数后,就要像十进制数那样对二进制数规格化,以便于计算机表示。
·二进制浮点数的规格化
规格化标准:经过调整小数点的阶码使得该数的有效值在1和2之间,既二进制浮点数的整数部分为1。
例如:0.8125 = 0.1101(二进制) = 1.101*2^(-1)
注意:上例末尾的(-1)是阶码,它也是二进制表示。然而,提到阶码就不得不提移码(增码),计算机移码就是在原有的补码的基础上对于符号取反。
·那么为何会用移码来表示阶码呢?
由于用补码表示阶码的时候,当阶码无限小,产生了下溢的时候,阶码变成了0,那么这个浮点数的值变为了1。而实际上这个数是无限接近于零的。那么咱们就须要取出其中的 "-0“ 值做为机器零。
先看浮点数二进制表达的三个组成部分:
主要成分是:
实例:
Step 1 改写整数部分
以数值5.2为例。先不考虑指数部分,咱们先单纯的将十进制数改写成二进制。
整数部分很简单,5.即101.。
Step 2 改写小数部分
小数部分咱们至关于拆成是2^-1一直到2^-N的和。例如:
0.2 = 0.125+0.0625+0.007825+0.00390625即2^-3+2^-4+2^-7+2^-8….,也即.00110011001100110011
Step 3 规格化
如今咱们已经有了这么一串二进制101.00110011001100110011。而后咱们要将它规格化,也叫Normalize。其实原理很简单就是保证小数点前只有一个bit。因而咱们就获得了如下表示:1.0100110011001100110011 * 2^2。到此为止咱们已经把改写工做完成,接下来就是要把bit填充到三个组成部分中去了。
Step 4 填充
指数部分(Exponent):以前说过须要以127做为偏移量调整。所以2的2次方,指数部分偏移成2+127即129,表示成10000001填入。
尾数部分(Mantissa):除了简单的填入外,须要特别解释的地方是1.010011中的整数部分1在填充时被舍去了。由于规格化后的数值整部部分老是为1。那你们可能有疑问了,省略整数部分后岂不是1.010011和0.010011就混淆了么?其实并不会,若是你仔细看下后者:会发现他并非一个规格化的二进制,能够改写成1.0011 * 2^-2。因此省略小数点前的一个bit不会形成任何两个浮点数的混淆。