计算机对数的计算

个人计算机组成原理学习记录

各种数的表示方法

  1. 原码(机器码),以此表示的数最高位不代表数值而是符号,运算时符号位和数值位分开运算
  2. 反码,负数时原码除符号位外取反,正数不变,运算时(+/-)符号位和数值位可一起进行运算,但会产生-0和+0
  3. 补码,负数时原码除符号位外取反+1,正数不变,运算时(+/-)符号位和数值位可一起进行运算,符号位即可表示符号又可以当作数值位进行运算,表示范围多一个(4位可表示-8~7)
  4. 移码/增码,补码最高位取反,最高位1表示正数,0表示负数。这样做可以使移码和原码(真值)在$-2^{n-1}$ ~ $2^{n-1}-1$区间呈线性正比关系,本质上是补码+偏置值,对于8位补码,偏置值为$2^{7}$。另一种移码和真值在$-2^{n-1}+1$ ~ $2^{n-1}-1$区间呈线性正比关系,偏置值是$2^{n-1} - 1$,这样的好处是留出指数$-2^{n-1}$(指数全为1)和$-2^{n-1}+1$(指数全为0)用作其他用途(特殊值)。
  5. 规格化浮点数,类似科学计数法:$+/-1.xxxxx_2 * 2^{E}$,1隐含,不用写在尾数位。

浮点数规格化表示特殊值(对于计算异常等更方便)

  1. 表示0:指数为0(负指数超出最小允许值);尾数为0;符号位0为+0,1为-0
  2. 表示无穷:指数为1(正指数超出最大允许值);尾数为0;符号位0为正无穷,1为负无穷。
  3. 表示非数(NaN):指数为1;尾数非0;符号位0/1

除法

除法最重要的是比较(绝对值)的步骤,要以比较的结果来判断商取0还是1。

对于X,Y的绝对值比较,可以通过|x|和|y|取绝对值后比较,也可以通过x+y(异号)=r/x-y(同号)=r的方法比较,当异号时r与y同号表示y的绝对值大,当同号时r与y同号表示y绝对值小。

并且注意,由于补码运算得到的商相当于以反码进行运算,因此x,y异号,商为负数,若够减时上商1会导致原码不正确,因此x,y异号够减时上商0。

补码运算最后的余数是以补码表示的。

在补码运算中,其绝对值比较就可以有下述的关系:

补码运算绝对值关系
[x]_补与[y]_补 比较操作
余数[r]_补与除数[y]_补 操作
同号 [x]_补+[-y]_补 同号,表示够减,或者说y绝对值大 1 当作[x]_补,左移+[-y]_补
异号,不够减 0 不恢复余数法左移+[y]_补
异号 [x]_补+[y]_补 同号,不够减 1 不恢复余数法左移+[-y]_补
异号,够减 0 当作[x]_补,左移+[y]_补

实际运算中商的精度一般与x,y精度相同,余数最后乘上$2^{-n}$,n为左移次数

商的校正

前面商的取值实际上是按照反码的方式进行的,当商最后得出为负,则会因反码与补码之间末位1的区别导致误差,因此有下列两种方式解决:

  1. 末位恒置1法

最后的商末位固定为1,即运算至最后的位数时,此时余数左移,商末位固定为1,除法结束

  1. 校正法

即运算至最后的位数时,仍按表格进行正常操作得到余数和商,之后商若为负,则加$2^{-n}$矫正,n为左移的次数,余数若和除数补码呈不够减的关系,则需要恢复余数,对于x、y同号,则加上[y]_补,若x、y异号,加上[-y]_补

浮点数运算

运算概念

  1. 舍入,类似十进制计算的四舍五入
  2. 对阶,使两数阶码相等以方便运算
  3. 规格化,使浮点数符合科学计数法($(1.xxx)_2 * 2^{E-127}$)

浮点数计算实质

规格化浮点数:

$A=M_a \cdot 2^{E_a}$ 和 $B=M_b \cdot 2^{E_b}$

  1. $A \pm B = (M_a \pm M_b \cdot 2^{-(E_a-E_b)}) \cdot 2^{E_a}$
  2. $A * B = (M_a * M_b) \cdot 2^{E_a + E_b}$
  3. $A / B = (M_a / M_b) \cdot 2^{E_a - E_b}$

浮点数运算可能结果

  1. 阶码上溢:无穷。
  2. 阶码下溢:0。
  3. 尾数溢出:尾数最高有效位进位,则右规将进位加入,指数增加。此时计算的尾数(补码表示)连同符号位右移,将移出的位放入附加位作为
  4. 非规格化尾数:数值部分高位0,左规,指数减少。浮点数运算时加上隐含的1,若运算后高位为0,就进行左规。左规尾数左移,附加位移出对应位数至尾数
  5. 右规、对阶有效位缺失:类似四舍五入,有效位优先,进行尾数舍入。参考舍入规则

上溢和下溢也是为什么指数使用移码且偏置常量为$2^{n-1} - 1$的原因。

附加位

为提高浮点数精度,IEEE754规定附加位(中间结果右边加2个附加位):

  1. Guard(保护位):significand(mantissa,尾数)右边的位
  2. Round(舍入位):保护位右边的位
  3. Stick(粘连位):舍入位右边有任何非0数,粘连位为1,否则0。

作用:

  1. 保护对阶右移、运算中间结果。
  2. 左规使移到尾数。
  3. 舍入依据。

舍入

用于计算最后进行舍入

IEEE 754规定的浮点数右规只需要1次。

舍入规则(看附加位):

  • 01:舍
  • 11:入
  • 10:强迫结果偶数
  1. 就近舍入(0舍1入法)
  2. 朝正无穷舍入(离待舍入尾数最近的数)
  3. 朝负无穷舍入
  4. 朝0方向舍入:直接截去

溢出时判断和处理(尾数补码表示,看符号位)

  1. 单符号位:Cf最高数值位进位,Cs符号位进位。相同时结果正确,不同时溢出。
  2. 双符号位:第一符号位$S_{f1}$和第二符号位$S_{f2}$不相同溢出。最高符号位$S_{f1}$代表真正的符号。
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信