定点数示例#
参考:定点表示:Q 格式和加法示例 & A Fixed-Point Introduction by Example
Q(数字)格式是一种定点方法,用于编码小数和整数,以便由计算机的 CPU 或数字信号处理器(DSP)进行处理。Q 格式用于通过标准整数硬件算术逻辑单元 (ALU) 实现有理数处理。当 CPU 缺少浮点单元 (FPU) 时,经常使用 Q 格式。该格式还可用于在低成本 DSP 上处理分数(fractions),从而降低硬件成本。
为了在较低成本或较旧的硬件上处理分数,Q 用于表示二进制小数点来表示分数。Q 格式以常规二进制有符号整数的形式存储和处理。Q 格式指定了用于表示整数部分的位数以及用于表示小数部分的位数。例如,如果要指出某个算法使用 1 位来指定整数部分,并使用 15 个位来指定小数部分,则可以使用 Q1.15 格式。如果 Q 格式中没有小数,例如 Q55,则表示所有位都用于表示小数值。
分数在 Q 格式下处理的示例:
实数 5.375,表示为
分数的有限字表示被称为定点数(fixed-point)。定点数是对二进制补码数字的解释,通常用于有符号表示,但不限于符号表示。它扩展了有限字长的范围,从有限的整数集合到有限的有理实数集合1。数的定点数表示由整数和小数部分组成。位长度定义为:
IWL
表示整数字长,FWL
表示小数字长,则总字长 WL
,可以表示为:
如上所述,定点数由其范围和分辨率定义,而不是由位数定义。在设计定点系统时,使用范围和分辨率要求并算法地解决实现设计时的位数是符合逻辑的。换句话说,在设计和指定时从范围和分辨率开始,并在实现时转移到所需的位数。通常,缩写表示格式。在讨论定点处理器时,Q 格式是常见的。在这里,将使用显式表示法 W=(wl, iwl, fwl)
。(注:这里不会使用 Q 格式,因为它不够灵活,并且可能会与旧的定点处理器文档中使用的符号混淆3。)这个符号定义了整数位数、小数位数和总位数。例如,W=(4,0,3)
是 4 位的数,其中包含 3 个小数位和 1 个符号位(符号位是隐含的)。本篇博文中的所有定点数都将采用 2 的补码表示法(符号位始终存在)。
为什么使用定点表示法?#
为什么不简单地将所有值规范化到整数范围并处理整数。根据您的观点,这可能显而易见或不明显。我发现许多设计师倾向于将所有值规范化为整数,但这会产生非常难以阅读的代码和文档。定点通常用于方便(类似于
c0 = fixbv(0.0032, min=-1, max=1, res=2**-15)
c1 = fixbv(-0.012, min=-1, max=1, res=2**-15)
可以很容易地将这归结为滤波器的系数,但是如果只看到整数使用:
c0 = intbv(0x0069, min=-2**15, max=2**15)
c1 = intbv(-0x0189, min=-2**15, max=2**15)
需要额外的信息(文档)。仅使用整数很难理解这些值所代表的含义。除了表示上的好处之外,处理舍入和溢出的工具在固定点类型中也很常见。
现在给出了定点二进制的基本定义,并给出了一些使用定点的原因。让我们看一下一些转换为定点类型的小数值。表 1 是定点表示法的示例。
前两个例子说明了如何使用定点命名法表示小数值。一般来说,如果将整数部分和小数部分视为单独的位向量(即不共享位索引),则二进制字的值如下:
在上述等式中,它假设位大小随着位索引的增加而增加。如果将小数字可视化,则相对于上面的描述,它将被翻转(flipped)。
以下是定点乘法和加法的示例。定点减法可以以类似于 2 的补码减法(负数相加)的方式计算。区别在于需要进行“点”记录,这与加法相同。对于加法和减法,操作之前需要对齐“点”(记录(bookkeeping))。通常在设计时计算“点”记录,而不是运行时(通常是因为存在块定点的概念,但这超出了本文的范围)。
定点乘法简介#
定点乘法与 2 的补码乘法相同,但需要在乘法后确定“点”的位置以解释正确的结果。“点”位置的确定是设计任务。实际实现不知道(或不关心)“点”的位置在哪里。这是正确的,因为定点乘法与 2 的补码乘法完全相同,不需要特殊硬件。
以下是一个示例,说明了
0110.1001 == 6.5625
000100.01 == 4.25
01101001
x 00010001
------------
01101001
00000000
00000000
00000000
01101001
00000000
00000000
00000000
--------------------
x000011011111001 == 0000011011.111001 == 27.890625
乘积(结果)所需的位数是被乘数的 WL
+ 乘数的 ML
:
乘法(和加法)结果的大小通常被调整,并且位的数量减少。在定点中,这具有直观的意义,因为较小的小数位被丢弃,并且基于被丢弃的位对值进行舍入。通常包括额外的硬件来完成舍入任务,并将位数减少到合理的数据路径总线宽度(data-path bus width)。
符号扩展#
当将两个带符号的数字相加时,被加数和加数可能具有不同的长度。在这种情况下,我们必须扩展较短数字的符号位,否则结果可能不正确。
例如,将
举个例子,当使用四位数字时,互补常量将是
为了使用六个位来表示
简单来说,通过复制数字的符号位,只是改变了互补常量,而该数字的值并没有改变。您也可以通过计算此示例的四位和六位表示的十进制等效值来验证此陈述。
定点加法#
加法稍微复杂一些,因为执行加法之前需要对齐“点”。使用乘法问题中的相同数字:
0110.1001 == 6.5625
000100.01 == 4.25
0110.1001
+ 000100.01
-------------
001010.1101 == 10.8125
当将两个数字相加(或相减)时,结果需要额外的一位。当将超过两个相同 WL
宽度的数字相加时,结果所需的位数为 N
是正在求和的元素数量。
假设使用浮点算法测试的以下数据的运算:
由于
在这种格式中,实现的二进制表示将使用
由于
对于负数,首先需要找到其绝对值的 Q 格式,然后将其转换为二进制补码表示以考虑负号。
假设
为了在 Q 格式中相加两个数字,我们应该首先对齐两个数字的二进制小数点,并对整数部分较短的数字进行符号扩展。让我们看一个例子:
计算
我们应该首先对齐两个数字的二进制小数点,并对整数部分较短的数字进行符号扩展,然后执行加法运算。我们得到
除了隐含的缩放因子之外,上述加法与在二进制补码表示中相加两个数字完全相同。由于二进制补码表示基于模数 M 算术,因此显然我们应该丢弃结果中高于符号位的位。因此,
在使用定点表示进行算术运算时,我们必须注意给定 Q 格式可以表示的值的范围。作为一个例子,假设我们将
然而,我们应该注意到溢出的可能性,因为将两个 N 位数字相加可能导致(N+1)位的结果。使用上述结果的 Qnc.mc 格式,我们必须确保没有发生溢出。以下示例进一步阐明了这一点。
如果我们丢弃整数部分的第四位,我们得到
为了规避加法中的溢出,我们可以缩放输入或使用可以处理 Q4.3 格式数字的加法器。对于后者,我们必须对数字进行符号扩展,以在整数部分中有四个位。请注意,由于将两个 N 位数字相加可能导致(N+1)位的结果,因此 Q4.3 输出格式将在将两个 Q3.3 数字相加时避免溢出。
计算
丢弃符号位以上的位,我们得到
避免溢出的防护位#
许多数字信号处理器选择累加器的输出寄存器比其输入寄存器大几个比特。这些额外的比特被称为防护位(Guard Bits)。防护位允许程序员在不缩放累加器输入的情况下累积多个值,从而避免溢出。你可以轻松验证具有
虽然我们可以使用更大的加法器来防止溢出,但我们不能无限地允许字长增长。因此,在我们的计算中,我们必须在某个地方截断或舍入加法结果到较短的字长。这通常意味着我们必须将更多的比特分配给加法结果的整数部分,以便我们可以表示更大的值。换句话说,我们必须改变二进制小数点的位置。