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

8-bit unsigned fixed point implementation with multiplication and clamping

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

我希望能够有效地将它们相乘,并且 addition/subtraction 应该最好限制在 [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++ 库可以有效地实现这种数据类型,或者有人可以告诉我必要的数学知识吗?

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

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

两个 U[0.8] 值相乘得到 U[0.16] 格式的 16 位结果。要转换回 U[0.8],您必须向右移动 8 位位置。因此,0x7F 乘以 0x7F 得到 0x3F01。右移 8 位得到 0x3F 的 U[0.8] 结果,如所希望的那样。

U[0.8] 格式的两个值可以使用普通整数运算进行加减。但是,您必须在结果中阻止 overflow/underflow 或检测 overflow/underflow。另外,要检测溢出,您可以将两个值零扩展到 16 位,执行加法,并检查结果是否大于 0xFF。如果是这样,你可以饱和 return 0xFF.

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