一 定点计数实验
1.1 实验原理
由于芯片成本和计算速度的限制,整数定点格式在实际中应用更加广泛。在计算机系统中, 最常用的是整数运算是加法和减法, 其次是乘法,最复杂的整数计算是除法。
在正整数乘加运算的过程中,加法会导致字长比最大加数的字长增加一位,而乘法结果的字长是两个乘数字长之和。
对于2补码整数来说,整数的加减法可以统一成2补码的符号取反和加法运算。
计算机系统表示小数点的方法包括科学计数法和日常如10.3这样的方法。以上两种表示方法, 在计算机系统中均有使用, 前者发展成为浮点数格式, 后者发展成定点数表示方法。
为了表示小数, 计算机工业制定了 IEEE754标准, 被称为 “浮点数标准”。 为了适应不同的需要, IEEE754标准定义了 16、32 、64 、 128 比特 多种字长的小数表示方法 。 其中最常用的是 32比特字长的小数格式,即,float 单精度浮点。 下图给出了 32比特 单精度浮点数的格式, 各部分数值的含义, 以及一个计算样例
图1. 1 IEEE754浮点数标准
由于浮点数比整数计算耗费资源大,因此日常生活中,常用“定点小数 (fixed point fraction)” 的小数表示方法。
定点数的格式由编程人员定义,如使用1234表示12.34。假设定点数格式的表示方法被记为SI(N)F(M),S表示为有符号数, N比特整数位, M比特小数位。 例如:SI9F7表示:有符号数,9比特整数位,7比特小数位。
① 浮点数转换为定点数
- 设浮点类型数据变量为 V_f ,需要转化为小数字长为FWL的 定点数 V_i
- 记: 缩放因子 SCALE = 2的FWL次幂, 即 2 ^ FWL 或 (1 << FWL)
- 则 V_i 等于 int(V_f * SCALE),其中 int()表示取整操作
- 如果希望提升数据精度, 则可以再取整时加入舍入操作
即根据数据的符号, 在对数据取整之前, 加上或者减去
② 定点数转化为浮点数设 定点数 V_i 其 小数字长为FWL, 要转化为浮点类型数据变量 V_f
- 记: 缩放因子 SCALE = 2的FWL次幂, 即 2 ^ FWL 或 (1 << FWL)
- 则有 V_f = float(V_i) / SCALE
- 其中 float() 表示将数据转化为浮点格式, 其中的 “/” 号 表示浮点除法
③ 定点数加法
两个定点数相加,设其定点格式分别为 SI(N1)F(M1) 和 SI(N2)F(M2), 设 N1 > N2, M1 > M2。 - 首先需要进行数据对齐, 即两个定点数的小数字长, 整数字长分别一致
- 即,在小数字长较小的数据低位补零, 在整数字长较小的数据高位符号扩展字长调整后, 两个数据的字长均为 SI(N1)F(M1)
- 为避免溢出, 还需将整数字长扩充1位
- 加法结果的字长格式为 SI(N1+1)F(M1)
- 对于变量字长无法扩充的情况,则为了避免溢出, 将加数进行算术右移,抛弃小数部分,从而为整数部分留出更多空间。
④ 定点数乘法
两个定点数相加,设其定点格式分别为 SI(N1)F(M1) 和 SI(N2)F(M2),设 N1 > N2, M1 > M2。 - 全精度乘法结果的字长是 SI(N1+N2)F(M1+M2)
- 乘法数据字长是以小数点为中心, 分别向两端扩展
- 通常保留 M1 位小数字长, 即可满足精度需求
- 小数截尾时,如果对精度有要求, 则需要考虑四舍五入问题
- 注意负临界值 ,在二补码系统中, 最高位为1, 其余为为0 是一种特殊的情况, 表示负边界值。 以4比特系统举例,
- 如果用一个4比特数据表示一个有符号的纯小数, 则定点格式为SI1F3
- 该系统的表示范围为 从 -1 到 +0.875 ,注意,此时的负数极值可以取到-1 ,但是正数极值小于1。
- 如果两个 SI1F3格式的数A和B相乘, 则全精度结果, 会得到 SI2F6格式的定点数C。
- C的负极大值是 -0.875,不含整数部分,此时高两位数据是二进制11, 表示其是一个负数
- C的正极大值是 1, 含1比特整数部分, 此时其高两位数据是二进制01,表示这是一个正数,整数部分是1
1.2 实验作业
- 使用C语言, 输入数据格式为16比特的short类型, 定点字长配置为SI1F15,验证定点加法和乘法计算
- 使用Verilog语言, 输入数据为10比特,定点字长配置为SI1F9,验证定点加法和乘法计算
1.3 实验结果
1.3.1 C语言
1.3.1.1 程序
// Joy 2018.03.19
#include <stdio.h>
#define FL 15