浮点运算
浮点加减法运算
- 对阶:通过移动尾数和修改阶码,使两个浮点数的阶码相等。通常小阶向大阶看齐,小阶的尾数右移。此步骤的目的是使小数点对齐,避免因阶码不同而导致运算错误。否则会丢失尾数高位,造成严重数值错误。
- 尾数加减:将对阶后的两个浮点数的尾数按带符号数(通常为补码)进行加或减运算。符号位参与运算。
- 规格化:调整运算结果的尾数和阶码,使其满足浮点数表示的规格化形式(通常为尾数最高有效位为 1)。
- 左规 (Left Normalization):
- 条件:运算结果的尾数最高位(小数点后第一位)为 0,即未达到规格化要求(如 0.0xxxx)。
- 操作:尾数左移一位,阶码减 1。重复此过程直到尾数最高位为 1。
- 判断阶码是否下溢:在左规过程中,若阶码减小到小于机器所能表示的最小阶码,则发生阶码下溢(Underflow),表示结果过小,可置为 0。
- 右规 (Right Normalization):
- 条件:运算结果的尾数出现溢出(如尾数最高位与符号位相同,对于补码表示为符号位与最高数值位不同,或尾数绝对值大于等于 1,如 1.xxxx)。
- 操作:尾数右移一位,阶码加 1。
- 判断阶码是否上溢:在右规过程中,若阶码增大到大于机器所能表示的最大阶码,则发生阶码上溢(Overflow),表示结果过大。
- 双符号位溢出表示法:
00:表示正数。11:表示负数。01:表示正溢出(结果为正,但数值超出表示范围)。10:表示负溢出(结果为负,但数值超出表示范围)。
- 左规 (Left Normalization):
- 舍入:对规格化后的尾数进行舍入处理,以保证运算结果的精度。当尾数右移或对阶时产生多余位时,需要进行舍入。常见的舍入方法有:
- 截断法(Truncation):直接舍弃多余的位。
- 0 舍 1 入法:类似于四舍五入,根据被舍弃的最高位决定是否进位。若舍入后破坏了规格化结果,则还需要再次进行规格化处理。
- 恒置 1 法:将被舍弃位的最高位设置为 1,其他位舍弃,然后进行加 1 操作。
- 最近偶数舍入法(Round half to even):IEEE 754 标准采用的舍入方法,避免了累积误差。

IEEE 754 浮点加减法运算
IEEE 754 浮点数的加减运算与(上节课介绍的)基于补码表示的浮点数的加减运算有如下不同:
-
阶码运算规则:
- 在对阶和结果规格化过程中,涉及到阶码的加减运算时,采用移码的加减运算规则。
-
尾数运算规则:
- 尾数运算采用原码运算规则(即符号位单独处理,数值位直接进行加减)。
- 隐藏位(即规格化浮点数尾数整数部分的隐含
1)要参与尾数运算。在运算前,隐含的1需要显式地补上,成为1.xxxx形式。
-
隐藏位参与尾数规格化判断和规格化过程:
- 规格化判断与调整:
- 若尾数形式为
1.⋯⋯(即整数部分为1),则为规格化尾数,符合 IEEE 754 规格化表示。 - 若尾数形式为
0.⋯⋯(即整数部分为0),则需要进行左规(将尾数左移1位,相应地将阶码减1),直到尾数规格化(即变为1.⋯⋯)为止。 - 若尾数最高位发生进位,形成
10.⋯⋯(即整数部分为10),则需要进行1次右规(将尾数右移1位,相应地将阶码加1),使其变为1.⋯⋯形式。
- 若尾数形式为
- 规格化判断与调整:
-
舍入处理:
- 就近舍入(Round to Nearest, Ties to Even):舍入为可表示的最近的数。如果数据正好处于两个可表示的数的中间,则向偶数(即最低有效位为
0)舍入。这是 IEEE 754 标准的默认舍入模式,可将平均误差降到最小。 - 朝正∞方向舍入(Round towards +∞):总是取右侧(即数值更大)可表示的最近的数。
- 朝负∞方向舍入(Round towards -∞):总是取左侧(即数值更小)可表示的最近的数。
- 截断处理(Truncation / Round towards 0):直接丢弃多余位,相当于朝
0方向舍入。
- 就近舍入(Round to Nearest, Ties to Even):舍入为可表示的最近的数。如果数据正好处于两个可表示的数的中间,则向偶数(即最低有效位为
-
溢出判断:
- 浮点运算的溢出(上溢或下溢)主要通过阶码的范围来判断。205 浮点数的表示形式和表示范围
- 对于 IEEE 754 单精度浮点数(阶码为
8位,偏置值为127)而言:- 上溢(Overflow):当运算结果的阶码大于最大可表示的规格化阶码(即偏置阶码
254,真值+127)时发生。此时结果通常表示为正负无穷大 (±Infinity)。例如,向右规格化导致阶码超过254。 - 下溢(Underflow):当运算结果的阶码小于最小可表示的规格化阶码(即偏置阶码
1,真值-126)时发生。此时结果可能被表示为非规格化数(阶码为0,真值-127)或直接舍入为零。例如,向左规格化导致阶码低于1。 - 特殊阶码值:
- 阶码全
1(11111111,偏置值为255) 用于表示无穷大 (±Infinity) 或非数 (NaN)。 - 阶码全
0(00000000,偏置值为0) 用于表示零 (±0) 或非规格化数 (Denormalized Numbers)。
- 阶码全
- 上溢(Overflow):当运算结果的阶码大于最大可表示的规格化阶码(即偏置阶码
浮点乘法运算(仅了解)
- 阶码相加,尾数相乘。
- 结果的规格化与舍入。

浮点除法运算(仅了解)
- 阶码相减,尾数相除。
- 结果的规格化与舍入。
