【问题标题】:8-bit unsigned fixed point implementation with multiplication and clamping具有乘法和钳位的 8 位无符号定点实现
【发布时间】:2019-11-01 16:55:33
【问题描述】:

我想用 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++ 库可以有效地实现这种数据类型,或者有人可以指出必要的数学吗?

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

【问题讨论】:

    标签: fixed-point


    【解决方案1】:

    您选择的定点格式 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] 格式的两个值可以使用普通整数运算相加或相减。但是,您必须防止上溢/下溢或检测结果中的上溢/下溢。要另外检测溢出,您可以将两个值零扩展为 16 位,执行加法,并检查结果是否大于 0xFF。如果是这样,您可以饱和并返回 0xFF。

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

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2019-11-12
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多