浮点转定点

博客 2020-05-30 阅读:95

在数字信号处理器领域,由于数字信号处理器芯片的限制,经常使用定点十进制算法。所谓的定点小数实际上是整数的十进制运算。以下是定点小数的一些理论知识的介绍。然后,以C语言为例,介绍了定点小数运算的方法。在TI C5000数字信号处理器系列中,16位用作最小存储单元,因此我们使用16位整数进行定点十进制运算。

从整数开始,16位存储单元最多可代表0x0000至0xffff和65536种状态。如果它用C语言表示无符号整数,它是从0到65535。如果需要表示负数,最高位是符号位,而剩余的15位可以表示32768个状态。这里可以看出,对于计算机或数字信号处理器芯片,符号不是以任何特殊的方式存储的,而是与数字一起存储的。为了使无符号数和有符号数使用相同的加减规则,有符号数中的负数由正数的补数表示。我们都知道-1 1=0,0x0001表示1,那么-1的表示法是什么呢?答案很简单:0xffff。现在你可以打开窗口的计算器,用十六进制计算0xffff0x0001,结果是0x10000。那么0x10000和0x0000等效吗?我们刚才说过,16位用来表示一个整数。最高位的1是第17位,该位是溢出位。该位未存储在操作寄存器中,因此结果是较低的16位,即0x0000。现在我们知道负数的表达式了。例如:-100。首先,我们需要知道十六进制数100。如果我们用计算器转换它,我们可以知道它是0x0064,那么-100是0x10000-0x0064,我们可以用计算器得到0xff9c。还有一种简单的转换符号的方法,就是取逆并加一:把数字x写成二进制格式,每个位0变成1,1变成0,最后把结果加1变成-x。好的,在复习了整数的相关知识后,我们将进入定点十进制运算。所谓固定小数点意味着小数点的位置是固定的。我们想用整数来表示定点小数。由于小数点的位置是固定的,因此不需要保存它(如果保存了小数点的位置,则它是一个浮点数)。由于没有存储小数点的地方,计算机当然不知道小数点的位置,所以小数点的位置是编写程序的人需要记住的。让我们以十进制为例。如果我们能计算12 34=46,当然我们也能计算或。因此,定点小数的加减与整数的加减相同,与小数点的位置无关。乘法是不同的。12*34=408和*。这里的小数点在第一位之前,而第二位的小数点被移动。所以做乘法时,你需要调整小数点的位置?但是,因为我们是做定点十进制计算,所以小数点位置不能移动!如何解决这个矛盾就是放弃最低的位置。也就是说*,这样我们就可以得到正确的定点运算结果。因此,在进行定点十进制运算时,我们不仅需要记住小数点的位置,还需要记住表示定点十进制的有效数字的数量。在上例中,有效数字是2,小数点后有一位。现在输入二进制。我们的定点十进制用16位二进制表示,最高位是符号位,然后有效位是15位。小数点后可以有0-15位数字。我们在小数点Qn后叫n位数字,例如,小数点Q12后的12位数字是定点小数,Q0就是我们所说的整数。Q12的正数的最大值是0,第一个0是符号位,后面的数字都是1,那么十进制中这个数是多少,这是一个很好的运算,即0x7fff/2^12=。对于Qn格式的定点十进制表达式,其整数值除以2 n。在计算机中,运算仍以整数形式完成。当我们把它想象成实际表达的值时,我们做这个运算。另一方面,当要表示的实际值x被转换为Qn类型的定点小数时,它是x * 2 n。例如,Q12类型的定点小数是:* 2 12=。因为该数字存储为整数,所以它是819或0x0333。由于小数部分被丢弃,0x0333不准确,事实上它是819/2 12=。

让我们用数学表达式来总结:

x代表实际数字(*一个浮点数),q代表其Qn定点小数(一个整数)。

q=(int)(x * 2^n)

x=(float)q/2^n

从上面的公式,我们可以很快得到-*/算法的定点小数:

假设q1、q2和q3的表达式值分别是x1、x2和x3

Q3=q1 q2如果x3=x1 x2

Q3=q1-q2如果x3=x1-x2

Q3=q1 * q2/2^n,如果x3=x1 * x2

Q3=q1 * 2^n/q2,如果x3=x1/x2

我们可以看到加法和减法与一般的整数运算是一样的,而在乘法和除法中,为了保持结果的小数点不变,对数值被移动。

用C语言写的定点小数的乘法是:

短q1、q2、Q3;

.

发表评论:

二维码