2.3 浮点数的表示和运算

2.3.1 浮点数的表示

1、浮点数的表示

浮点数通常表示为:

  • r:阶码的底,通常为2

  • E:阶码,反映浮点数的表示范围和小数点的实际位置,用补码或移码表示

  • M:尾数,其位数反映了小数的精度,用原码或补码表示

例:阶码和尾数都用补码表示,求a、b的真值

  • a = 0,01; 1.1001

  • b = 0,01; 0.01001

a:

  • 阶码0,01对应真值+1

b:

  • 阶码对应真值+1

2、浮点数的规格化

规定尾数的最高位必须是一个有效值。

左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数左移一位,阶码减1 ( 基数为2时):

右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数右移一位,阶码加1 (基数为2时)。

例:a=010; 00.1100;b = 010; 00.1000,求a+b

a=2^{2}\times 00.1100\quad b=2^2\times00.1000\\ \begin{align} a+b &= 2^{2} \times (00.1100 + 00.1000)\\ &= 2^{2} \times 01.0100\quad(\text{发生溢出})\\ &= 2^{3} \times 00.1010 \end{align}

规格化的目的:增加数据表示的精度

3、IEEE 754 标准

尾数前隐含一位1

对于短浮点数而言,偏置值取127,此时阶码(移码)的表示范围为**-126~127**:

-128和-127的作用:

例:将 -0.75D 转换为IEEE 754 的单精度浮点数格式表示

  • 将十进制转化为二进制

  • 将小数的高位变为1 (对应尾数隐含的1)

  • 数符:1

  • 尾数:取小数点后面部分,并补0

    • .1000 0000 0000 0000 0000 000

  • 阶码:真值+偏移量

  • 结果:1 0111 1110 1000 0000 0000 0000 0000 000

例:IEEE 754的单精度浮点数 C0 A0 00 00 H的值是多少

  • 化为二进制

    • 1100 0000 1010 0000 0000 0000 0000 0000

    • 数符:1

    • 阶码:1000 0001

    • 尾数:0100 0000 0000 0000 0000 000

  • 尾数:加上隐含的1

  • 阶码

    • 先看作无符号数:1000 0001B = 129D

    • 移码-偏置值:129-127=2

2.3.2 浮点数的运算

1、加减运算

步骤

  1. 对阶

  2. 尾数加减

  3. 规格化

  4. 舍入

  5. 判溢出

5D=101B,\frac{1}{256}=2^{-8}\\ \begin{align} X&=-101\times2^{-8}\\ &=-0.101\times2^{-5D} \\ &=-0.101\times2^{-101} \end{align}

  • 阶码

    • -101,补码为:1011

    • 阶符取两位、阶码取三位:11011

  • 尾数

    • -0.101,补码为1.011

    • 数符取两位,尾数取九位:11.011000000

  • 可得X:11011;11.011000000

同理:59D=111011B,\frac{1}{1024}=2^{-10}\\ \begin{align} Y&=+111011\times2^{-10}\\ &=+0.111011\times2^{-4D} \\ &=+0.111011\times2^{-100} \end{align}

  • 阶码

    • -100,补码为1100

    • 阶符取两位、阶码取三位:11100

  • 尾数

    • +0.111011,补码为0.111011

    • 数符取两位,尾数取九位:00.111011000

(1)对阶

使两个数的阶码相等,小阶向大阶看齐,尾数每右移一位,阶码加1。

阶码每加1,尾数右移一位,则有新的X:11100;11.101100000(右移之后前面补1)

(2)尾数相加减

首先有 -Y= 11100;11.000101000

尾数相加,得:

相当于提取公因式

(3)规格化

由于上一步发生了溢出,因此需要右规

尾数右移一位,阶码加1,得:X-Y=11101;11.011000100

(4)舍入

“0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1, 则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。

恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”, 都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。

无舍入

(5)判断溢出

未发生溢出

2、强制类型转换

char --> int --> long --> double 以及 float --> double,不会损失精度。

对于32位系统:

  • int --> float:可能损失精度(有效数字比float多)

  • float --> int:可能溢出(超出int表示范围)及损失精度(小数部分)

最后更新于