算术运算
请注意
这些部分将帮助您了解哪些数据类型和伸缩选择会导致溢出或精度损失。
模运算
二元数学是基于模算术的。模算术只使用一个有限的数字集,将给定集合之外的任何计算结果包装回集合中。
例如,普通的日常时钟使用模12算法。这个系统中的数字只能是1到12。因此,在“时钟”系统中,9加9等于6。这可以更容易地可视化为一个数字圆:
类似地,二进制数学只能使用数字0和1,在这个范围之外的任何算术结果都被“环绕”为0或1。
二进制补码
2的补数是有符号定点数的常用表示形式。在2的补数中,正数总是以0开头,负数总是以1开头。如果2的补数的前导位为0,则通过计算该数的标准二进制值来获得该值。如果2的补数的前导位为1,则假设最左边的位为负数,然后计算该数的二进制值即可得到该值。例如,
要用2的补数计算二进制数的负数,
取1的补足语。也就是说,所有的0都变成了1所有的1都变成了0。
用二进制数学加一个1。
丢弃超出原始字长的任何位。
例如,考虑取11010(-6)的负数。首先,取这个数的1的补数,或者翻转位:
接下来,加一个1,把所有数字都包装成0或1:
加减法
定点数的加法要求加数的二进制点对齐。然后使用二进制算术来执行加法,这样就不会使用0或1以外的数字。
例如,考虑将010010.1(18.5)与0110.110(6.75)相加:
定点减法等价于在对任何负数使用两者的补值时进行加法。在减法中,加数必须加号以匹配彼此的长度。例如,考虑用010010.1(18.5)减去0110.110 (6.75):
大多数执行加法的定点DSP系统工具箱™块在执行加法之前将加法器输入转换为累加器数据类型。因此,在加法过程中不需要进一步移动以对齐二进制点。看到数据类型转换获取更多信息。
乘法
2的补定点数的乘法直接类似于常规的十进制乘法,不同的是中间结果必须进行符号扩展,以便在将它们相加之前将它们的左侧对齐。
例如,考虑10.11(-1.25)与011(3)的乘法:
乘法数据类型
下面的图表显示了“系统工具箱”软件中用于定点乘法的数据类型。这些图表说明了用于实数、复数-实数和复数-复数乘法的数据类型之间的差异。查看各个参考页以确定特定块是否接受复杂的定点输入。
在大多数情况下,可以在块掩码中设置乘法期间使用的数据类型。详细信息请参见数据类型转换.
请注意
下面的图表显示了在“系统工具箱”软件中乘法中定点数据类型的使用。它们并不代表软件执行乘法所使用的实际子系统。
实际的乘法。下图显示了“系统工具箱”软件中用于两个实数相乘的数据类型。软件以产品输出数据类型返回此操作的输出,如下图所示。
更复杂的乘法。下图显示了“系统工具箱”软件中用于实数和复杂定点数相乘的数据类型。实-复和复-实乘法是等价的。软件以产品输出数据类型返回此操作的输出,如下图所示。
纷繁复杂的乘法。下图显示了“系统工具箱”软件中两个复杂定点数的乘法。请注意,软件以累加器输出数据类型返回此操作的输出,如下图所示。
在执行加法或减法操作之前强制转换为累加器数据类型的“系统工具箱”块。在上面的图中,这相当于C代码
acc =交流;acc - =双相障碍;
对于减法器,和
acc =广告;公元前acc + =;
对于蝰蛇,在哪里acc是累加器。
数据类型转换
许多执行算术操作的定点系统工具箱块允许您指定累加器、中间产品和产品输出数据类型(如适用),以及块的输出数据类型。本节概述了对这些数据类型的强制转换,以便您可以判断所选择的数据类型是否会调用符号扩展、用零填充、舍入和/或溢出。符号扩展是将具有最高有效位的位加到2的补数的高端。符号扩展不会改变二进制数的值。填充是用一个或多个零扩展二进制字的最低有效位。
转换为累加器数据类型
对于大多数执行加法或减法的定点“系统工具箱”块,操作数首先转换为累加器数据类型。大多数情况下,可以在块掩码上指定累加器数据类型。具体操作请参见蓄电池中的数据类型参数为块指定定点属性.由于加数在相加之前都转换为相同的累加器数据类型,因此不需要额外的移位来确保它们的二进制点对齐。加法的结果保留在累加器数据类型中,有溢出的可能。
转换为中间产品或产品输出数据类型
对于执行乘法的“系统工具箱”块,将乘法器的输出放入产品输出数据类型中。然后将产品输出返回给乘数的块可能首先将其转换为中间产品数据类型。大多数情况下,可以在块掩码上指定这些数据类型。具体操作请参见中间产品而且产品输出中的数据类型参数为块指定定点属性.
类型转换为输出数据类型
许多定点系统工具箱块允许您在掩码上指定块输出的数据类型和缩放。请记住,软件不允许在其块的输入和输出端口上使用混合类型。因此,如果希望为支持定点数据类型的“系统工具箱”块指定定点输出数据类型和缩放,则必须向该块的输入端口提供定点信号。万博1manbetx定点系统工具箱块的最终强制转换为该块的输出数据类型。
注意,虽然不能在块的输入和输出端口上混合使用定点信号和浮点信号,但是可以在支持定点信号的块的端口上使用不同字和分数长度的定点信号。万博1manbetx
铸造的例子
在选择这些中间数据类型以及特定块允许的任何其他中间定点数据类型时,务必记住每种强制转换的分支。根据您选择的数据类型,可能会发生溢出和/或舍入。下面两个示例演示了可能发生溢出和舍入的情况。
从较短数据类型转换为较长数据类型。考虑将一个非零数(由两个小数位的4位数据类型表示)转换为一个有七个小数位的8位数据类型:
如图所示,源位向上移位,使二进制点与目标二进制点位置相匹配。最高源位不合适,因此可能发生溢出,结果可能饱和或封装。目标数据类型末尾的空位用0或1填充:
如果没有发生溢出,则用0填充空位。
如果发生换行,则用0填充空位。
如果发生饱和,
正数的空位用1填充。
负数的空位用0填充。
您可以看到,即使从较短的数据类型强制转换为较长的数据类型,仍然可能发生溢出。当源数据类型的整数长度(在本例中为2)大于目标数据类型的整数长度(在本例中为1)时,就会发生这种情况。类似地,即使在从较短的数据类型转换为较长的数据类型时,如果目标数据类型和缩放的小数位比源数据类型少,也可能需要舍入。
从较长数据类型转换为较短数据类型。考虑将一个由7个小数位的8位数据类型表示的非零数转换为具有2个小数位的4位数据类型:
如图所示,源位向下移位,使二进制点与目标二进制点位置匹配。源的最高位没有值,因此结果是符号扩展,以填充目标数据类型的整型部分。源的底部五位不符合目标长度的分数。因此,当结果被四舍五入时,精度可能会损失。
在这种情况下,即使转换从较长的数据类型转换为较短的数据类型,所有整数位都被保留。相反,即使转换为较短的数据类型,只要目标数据类型的分数长度与源数据类型的分数长度相同或更长,也可以保持完全的精度。然而,在这种情况下,从结果的高端丢失位,并可能发生溢出。
最坏的情况是,目标数据类型的整数长度和分数长度都小于源数据类型的整数长度和分数长度。在这种情况下,可能会发生溢出和精度损失。