具有乘法和钳位的8位无符号定点实现

时间:2019-11-01 16:55:33

标签: fixed-point

我想使用8位字表示[0.0,1.0]范围内的数字(最好包括两个端点)。

我希望能够有效地进行乘法运算,并且加法/减法应该最佳地限制在[0,1],而不是溢出。

例如,如果0xFF表示1.0,0x00表示0.0,则乘法应产生例如

0x3F(0.247)= 0x7F(0.499)* 0x7F(0.499)

我发现https://courses.cs.washington.edu/courses/cse467/08au/labs/l5/fp.pdf,并且我认为论文将其命名为U(0,8)对应于我要寻找的内容,但是我不理解例如将需要如何实现乘法。

是否有一个c ++库可以有效地实现这种数据类型,或者有人可以将我指向必要的数学?

我不需要除法,只需要乘法,加法和减法

1 个答案:

答案 0 :(得分:1)

您选择的定点格式U [0.8]不包含确切的端点值1。此格式的最大值实际上是0.99609375。如果这对您来说足够接近,我们可以谈谈数学。

将两个U [0.8]值相乘得出U [0.16]格式的16位结果。要转换回U [0.8],必须向右移动8位位置。因此,将0x7F乘以0x7F得出0x3F01。向右移8位,可以根据需要将U [0.8]的结果设为0x3F。

可以使用常规整数运算来添加或减去U [0.8]格式的两个值。但是,您必须防止溢出/下溢或检测结果中的溢出/下溢。要检测额外的溢出,可以将两个值零扩展到16位,执行加法,然后检查结果是否大于0xFF。如果是这样,您可以饱和并返回0xFF。

对于减法,您可以在进行减法之前比较这些值,如果结果为负,则返回零。