软件设计师考点——浮点数

995 阅读5分钟

浮点数的一般表示

JfJ_fj1j2......jmj_1j_2...... j_mSfS_fS1S2......SmS_1S_2...... S_m
阶符阶码数符尾数
  • 阶符:阶码的符号位。1为负;0为正
  • 阶码:即幂的大小。设幂e
  • 数符:尾数的符号位。1为负;0为正
  • 尾数:尾数的大小。设尾数M

一般基数 r=2r = 2 ,则浮点数真值 N=(1)jfre(1)SfM=(1)jf2e(1)SfMN = (− 1)^{j_f} * r^{e * (-1)^{S_f} }* M = (− 1)^{j_f} * 2^{e * (-1)^{S_f} }* M

IEEE 754标准的浮点数

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

V=(1)S×M×(2)EV=(-1)^{S} \times M \times (2)^{E}

  • S 表示符号位 ( sign ) ,当s=0,V为正数;当s=1,V为负数。
  • M表示有效数字(又称尾数 、 mantissa),大于等于1,小于2。
  • 2^{E} 2表示基数(base),E 表示指数位(exponent ,又称阶码)。

( 省略了阶码。因为移码就隐含表示了阶码的正负 )

img

​ 浮点数的存储格式

符号的存储

符号的存储很容易,单独分配出一个位(Bit)来表示,用 0 表示正数,用 1 表示负数。

尾数的存储

当采用二进制形式后,尾数部分的取值范围为 1 ≤ mantissa < 2,这意味着:尾数的整数部分一定为 1,是一个恒定的值,这样就无需在内存中提现出来,可以将其直接截掉,只要把小数点后面的二进制数字放入内存中即可。对于 1.0011101,就是把 0011101 放入内存。

指数的存储

对于单精度float类型,指数域有8位,可以表示 0-255个指数值。双精度 double 类型,指数域有 11 位,可以表示 0 - 2047 个指数值。指数值规定了小数点的位置,小数点的移动代表了所表示数值的大小。

但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差 值为 -127,而双精度double类型的偏差值为 -1023。

如何记住单精度、双精度的偏差:
单精度 , 指数域有 8 位 ,可以表示的访问 [0 , 255] 。
          偏差为 -(0 + 255)/2 = -127.5 , 向下取整 -127

双精度 , 指数域有 11 位 ,可以表示的访问 [0 , 2047] 。 
          偏差为 -(0 + 2047)/2 = -1023.5 , 向下取整 -1023

比如,单精度指数域中的64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127 到 128 之间(包含两端)。我们不久还将看到,实际的指数值-127(保存为 全 0)以及 +128(保存为全1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -126 和 +127 之间

规格化浮点数

规格化浮点数的特点是

  • -存储阶码的位既不全为0也不全为1,存储尾数的位可以随意定制

    示意图如下

    img

    单精度数的偏差 值为 -127,而双精度double类型的偏差值为 -1023。

    对于单精度 float 类型,指数域有8位,可以表示 0 - 255 个值 。 规格化的浮点数存储阶码的位既不全为 0 也 不全为1,其能表示的值范围是 1 - 254 。单精度数的偏差 值为 -127。单精度规格化的浮点数的数阶码值的取值范围是-126 ~ 127

    对于双精度 double 类型,指数域有 11 位,可以表示 0 - 2047个值 。 规格化的浮点数存储阶码的位既不全为 0 也 不全为1,其能表示的值范围是 1 - 2046。单精度数的偏差 值为 -1023。单精度规格化的浮点数的数阶码值的**取值范围是 -1022 ~ 1023 **

  • 规定尾数的最高有效位必须为1,若尾数最高有效位不是1,则需要进行左归(即尾数整体左移一位),每左归一次,阶码加1,直到最高有效位为1。

    尾数部分隐藏了一个整数1(隐藏一位1是为了增加一位有效位),因此尾数的实际大小为1 + M = 1. M 1+M=1.M1+M=1.M

    比如,对单精度数而言,二进制的 1001.101(即十进制的 9.625)可以表达为 1.001101×23,所以实际保存的位数是:00110100000000000000000

非格式化值

当指数位 E 全为 0 时,所表示的数就是非规格化形式

image-20201003115212654

在这种情况下,而有效数字(尾数) M ,也就是说它是小数段的值,不包含隐含的开头的 1。

非规格化值有两个用途:

  • 它提供了一种表示数值 0 的方法。因为规格化数必须得使有效数字 M 在范围 1≤M<2 之中,即 M≥1,因此它就不能表示 0
  • 它表示那些非常接近于 0.0 的数。它们提供了一种属性,称为逐渐下溢出。其中,可能的数值分布均匀地接近于 0.0。

浮点数的取值访问

在这里插入图片描述

单精度双精度
指数域8 bit
尾数23 bit
最小值 (最小负数)S=-1 , M=1.111... , E= 127
(2223)×2127-( 2 - 2^{-23} ) \times 2^{127}
S=-1 , M=1.111... , E= 1023
(2252)×21023-( 2 - 2^{-52} ) \times 2^{1023}
最大负数S= -1 ,M=1.0 , E = 1 - 127 = -126
2126-2^{-126}
最小正数S= 1 ,M=1.0 , E = 1 - 127 = -126
21262^{-126}
最大正数S=1 , M=1.111... , E= 127
(2223)×2127( 2 - 2^{-23} ) \times 2^{127}
S=-1 , M=1.111... , E= 1023
(2252)×21023( 2 - 2^{-52} ) \times 2^{1023}
指数域尾数最小值
(最小负数)
最大负数最大值
(最大正数)
单精度8 bit23 bitS=-1 , M=1.111... , E= 127
(2223)×2127-( 2 - 2^{-23} ) \times 2^{127}
S= -1 ,M=00(22).....100_{(22)}.....1 , E = 0S=1 , M=1.111... , E= 127
(2223)×2127( 2 - 2^{-23} ) \times 2^{127}
单精度
(非规格化)
8 bit23 bit
双精度
(规格化)
11 bit52 bitS=-1 , M=1.111... , E= 1023
(2252)×21023-( 2 - 2^{-52} ) \times 2^{1023}
S=-1 , M=1.111... , E= 1023
(2252)×21023( 2 - 2^{-52} ) \times 2^{1023}
双精度
(非规格化)
11 bit52 bit

blog.csdn.net/weixin_4225…