首页 > 其他分享 >《计算机组成与设计:硬件/软件接口》第三章 计算机的算术运算笔记

《计算机组成与设计:硬件/软件接口》第三章 计算机的算术运算笔记

时间:2022-10-19 21:47:45浏览次数:48  
标签:表示 第三章 规格化 二进制 计算机 t3 接口 exp 小数


title: 第三章 计算机的算术运算笔记
date: 2022-10-18 周二
摘要: 本文是《计算机组成与设计:硬件/软件接口》第三章的学习记录,其中辅以cs61c以及csapp的部分内容。
mindmap-plugin: basic
tags:

  • arithmetic
  • operation

目录

第三章 计算机的算术运算笔记

3.2 加法和减法

加减法的溢出条件

有符号整数

操作 操作数A 操作数B 表示有溢出的条件
A+B >= 0 >= 0 <0
A+B < 0 < 0 >=0
A-B >= 0 < 0 <0
A-B < 0 >= 0 >=0

检测代码

# check $t1 + $t2
xor $t3, $t1, $t2 		# check if the signs of two oprands are different.
slt $t3, $t3, $zero	# if differs, $t3 will be negative, and thus less than zero and set to 1
bne $t3, $zero, NO_OVERFLOW	# if deffers, overflow won't ever happens

addu $t4, $t1, $t2		# $t4 = sum, but don't trap
xor $t3, $t4, $t1		# check if the result's sign match the ideal sign
slt $t3, $t3, $zero	# if differs, $t3 will be negative, and thus less than zero and set to 1
bne $t3, $zero, OVERFLOW

无符号整数

可以忽略。

由于无符号数通常用于表示内存地址,这种情况下的溢出可以忽略 --p119

检测代码

not $t3, $t1, $zero
sltu $t3, $t3, $t2
bne $t3, zero, OVERFLOW

3.3 乘法

硬件(填空)

image-20221018222102512

流程

image-20221018222154009

  1. 测试乘数最低位
    1. 若为 1,则在乘积加上被乘数
    2. 若为 0,则继续
  2. 左移被乘数
  3. 右移乘数
  4. 判断是否进行了 32 次
    1. 是则退出
    2. 否则返回 1

改进

被乘数左移,相对来说就是乘积右移,因此可以把乘积和乘数放在一块一起右移。

因为乘积不会一下到64位,而乘数每次都可以丢弃一位,因此是合理的。

image-20221018222647715

3.4 除法

搞懂乘法,除法就不难了。

硬件(填空)

image-20221018223349133

流程

image-20221018223427732

  1. 初始化,被除数放在一个64位寄存器里的右半边,除数放在另一个64位寄存器的左半边,商用一个32位寄存器初始为0
  2. 左移商
  3. 尝试用余数减去除数
    1. 若非负,商的最低为赋值为 1
    2. 若为负,给余数加回除数,商的最低为赋值为 0
  4. 左移商(得先左移,再赋值,否则结果相当于乘以 2 )
  5. 右移除数
  6. 判断是否第33次重复
    1. 是则结束
    2. 否则回到第 2 步

判断 33 次可以理解为 1 + 32,因为除数没右移时也要尝试一次减法,而右移 32 位每次都要尝试一次减法。

改进

image-20221018225127205

3.5 浮点运算

3.5.1 浮点表示

小数的二进制表示

回顾一下小数的二进制表示。

二进制小数 to 小数

和整数形式上是一致的

image-20221019143049639

小数 to 二进制

首先可以尝试观察法:把小数表示为带分数,结合移位的知识进行表示,如

Value Representation
\(5\frac{3}{4}\) \(101.11_2\)
\(2\frac{8}{7}\) \(10.111_2\)
\(1\frac{7}{16}\) \(1.0111\)

另一种方法是令小数部分不断乘以 2,依次取个位,即为小数点后的位数,如图

image-20221019143527377

科学计数法与规格化

image-20221019143701681

科学记数法:小数点左边只有一位整数的记数法

一个采用科学记数法表示的数,若没有前导 0 且小数点左边只有一位整数,则可称为规格化 (normalized)。

二进制的科学计数法类似十进制,只是基数从10变成了2.

Value Representation Scientific Notation
\(5\frac{3}{4}\) \(101.11_2\) \(1.0111 * 2^2\)
\(2\frac{8}{7}\) \(10.111_2\) \(1.0111*2^1\)
\(1\frac{7}{16}\) \(1.0111\) \(1.0111 * 2^0\)

注:指数在计算机中也是以二进制存储的,这里仅为简化而用十进制

IEEE Floating Point(IEEE 754)

浮点数的表示类似于上述科学计数法:

\[(- 1)^s * M *2^E \]

\(s\) 用来确定符号;

\(M\) 表示 \(fraction\) 或 \(significand\) ;

\(E\) 表示 \(exponent\)

image-20221019152247330

在计算机中的表示

如图所示。

float

image-20221019145257012

double

image-20221019152456532

其中s和exponent直接对应了s和E,但是fraction到F要根据指数是否为 0 分类处理。

根据指数的不同,浮点数可分为三类

image-20221019153455858

Case 1: Normalized Values
  • 条件:\(exp ≠ 000…0 \and exp ≠ 111…1\)

  • 结果:

    • 指数为偏阶表示:Exponent coded as a biased value: E = Exp – Bias

    • 规格化二进制数的前导位 1 会被隐藏 :Significand coded with implied leading 1: M = \(1.xxx…x_2\)

      • The significand is defined to be \(M = 1 + f\) .
      • \(xxx…x\): bits of frac field
      • Minimum when \(frac=000…0 (M = 1.0)\)
      • Maximum when \(frac=111…1 (M = 2.0 – ε)\)
      • Get extra leading bit for “free”
Case 2: Denormalized Values
  • 条件:\(exp = 000...0\)

  • 结果:

    • the exponent value is E = 1 − Bias

    • the significand value is M = f

    • that is, the value of the fraction field without an implied leading 1

  • 例子(float):image-20221019185330485

  • 作用:

    • 表示正负零

    • 表示趋近 0 的数

  • 和Normalized Values的联系:

    • 最大的非规格化数是最小的规格化数
    • image-20221019185408780
Case 3: Special Values

Biased exponent fields 0 and 255 accommodate overflow, underflow, and arithmetic errors.

浮点数能表示的范围有限,在这之外即溢出。

image-20221019185803645

image-20221019185852188

正负无穷

出于数学上的考虑,一个数除以 0 时会得到正负无穷。

表示: \(exp = 111..11_2, f = 000..00_2\),符号位表示正负

NaN

数学中不符合定义的一些计算结果会得到NaN,如负数开方。

表示: \(exp = 111..11_2, f = nonzero\)

总结

IEEE 754:

  1. 对于规格化二进制数,隐藏前导位 1.
  2. 对于非规格化的二进制数,令指数位为 0,指数为\((1 - bias)\),表示接近 0 的数
  3. 用特殊的符号来表示异常事件
  4. 将最小的负指数表示为 \(00...00_2\) 而最大的正指数表示为\(1111_2\)。称为带偏阶的记数法(biased notation)。需要从带偏阶的指数中减去偏阶,才能获得真实的值

浮点数的分布

浮点数表示的总结

3.5.2 浮点加法

步骤

image-20221019204233386

  1. 指数匹配,小的要匹配上大的
  2. 有效位数相加
  3. 规格化
  4. 检查溢出(检查指数)
  5. 舍入并检查是否规格化,是则结束,否则跳转至 3

例题

image-20221019204914693

image-20221019204942882

3.5.3 浮点乘法

步骤

image-20221019204740665

例题

image-20221019204852134

浮点数运算需要的检查

1. 检查溢出

即检查指数是否在对应的表示范围内,需要在小数规格化之后进行,以float为例,exp的范围应该是

\[-126 \le exp \le 127 \]

若加上偏阶,则为

\[1 \le exp' \le 254 \]

若计算后指数不在这个范围,则表示溢出。

p.s: \(exp'= 0\)和\(exp'=255\)被用于表示特殊情况(见上文)

另外在此条件下的最大最小值为:

image-20221019205900092

2. 检查规格化

即检查小数点左边是否只有一位整数,需要在对小数舍入之后进行。

标签:表示,第三章,规格化,二进制,计算机,t3,接口,exp,小数
From: https://www.cnblogs.com/tsrigo/p/16807863.html

相关文章

  • UE5 中用 Python 接口创建 Level Sequence 与设置 TriggerEvent
    UE5中用Python接口创建LevelSequence与设置TriggerEvent本文内容可能只能在UE5下有用,未在UE4环境下实验过。背景遇到了一个美术需求,需要批量读取一段动画,制......
  • Day02(计算机及DOS常用快捷命令)
    快捷键Ctrl+C:复制Ctrl+V:粘贴Ctrl+A:全选Ctrl+X:剪切Ctrl+Z:撤销Ctrl+S:保存Alt+F4:关闭窗口Shift+Delete:永久删除Win+R:运行regedit窗......
  • 计算机网络__ 运输层
    概述运输层在五层协议的体系结构的位置从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当......
  • 怎么在uboot下使用通用GPIO接口
    一:在uboot下的defconfig打开如下配置CONFIG_DM=yCONFIG_DM_GPIO=yCONFIG_DWAPB_GPIO=yCONFIG_CMD_GPIO=y二:重新编译u-boot后会生成cmd:gpio在板端执行"gpiostat......
  • 第三方接口调用httpUtils
    1.GET请求publicstaticJSONObjectgetHttpGetResp(Stringurl,Stringauthorization,Stringtitle){HttpGethttpGet=newHttpGet(url);Stri......
  • 【JAVA】接口和抽象类有什么区别?
    ##前言Java是非常典型的面向对象语言,曾经有一段时间,程序员整天把面向对象、设计模式挂在嘴边。虽然如今大家对这方面已经不再那么狂热,但是不可否认,掌握面向对象设计原则和......
  • 使用Kong网关API接口配置
    一、Upstream1、创建Upstream:curl-i-XPOSTIPAddress:8001/upstreams-d'name=upstream-test'-d'slots=1000'2、创建Targets目标地址并且关联Upstream:curl-i-XPO......
  • 0003 机器学习实战 第三章 分类
    1 本章所有示例代码#!/usr/bin/envpython#-*-coding:UTF-8-*-"""路径:lesson03.py标题:分类创建:2022-10-1517:46更新:2022-10-1517:......
  • Dubbo——Remoting 层核心接口分析
    前言dubbo-remoting模块提供了多种客户端和服务端通信的功能。在Dubbo的整体架构设计图中,我们可以看到最底层红色框选中的部分即为Remoting层,其中包括了Exchange、Tr......
  • GenericServlet改造,ServletConfig接口
    GenericServlet(java自己编写好了)我们编写一个Servlet类直接实现Servlet接口有什么缺点?我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。适......