【问题标题】:Calculate product of floating point numbers with fixed point arithmetic用定点算法计算浮点数的乘积
【发布时间】:2018-06-14 21:30:55
【问题描述】:

我有两个工作要做:

  1. 我需要在内存中存储两个传感器值(使用 FPU)
  2. 然后在没有 FPU 的情况下计算这两个值的乘积。

我的传感器是:

  • 传感器 1 给出的值介于 0 到 40 之间,分辨率为 0.2
  • 传感器 2 给出的值介于 -10 和 10 之间,分辨率为 0.1

为了以有效的方式存储数据,我使用偏移量和比例因子将值转换为整数

uint8 uint_value = (floating_value - offset) / resolution;

样本数据: 传感器 1:

Real World Value 0.0 -> uint_value = 0
Real World Value 20.2 -> uint_value = 101

传感器 2:

Real World Value -10.0 -> uint_value = 0
Real World Value 0.5 -> uint_value = 105

现在我在执行第二个任务时遇到了一些问题。我需要在不使用浮点运算的情况下计算这两个值的乘积。

我该怎么做?我看过定点数,它提供了通过整数乘法和移位进行乘法的可能性。 但我似乎无法弄清楚如何将我的缩放值转换为定点数。

【问题讨论】:

  • 请提供一些示例数据 - 转换存储之前和之后的数据。
  • 除此之外,第一步,我会用value = lround((floating_value - offset) / resolution);“四舍五入”当然uint8对于“-10到30之间的值,分辨率为0.1”不太好。试试int16_t

标签: c fixed-point


【解决方案1】:

执行整数乘法,然后将小数按比例之和移动。

【讨论】:

  • 但是我的刻度不能完全用二进制分数表示。如何处理偏移值?我也考虑过将我的“手动缩放”值转换为像 Q8.8 这样的固定格式的定点数,但我还没有找到如何做到这一点
  • 你的基数是 10,你的指数是 -1,因此分辨率是 10^-1 = .1,所以在乘法之后,真正的分辨率是 10^-2 = .01
【解决方案2】:

您遇到的问题基本上是 0.2 和 0.1 不能完全表示为二进制分数。您将一个值乘以 5,将另一个乘以 10。在某些时候,您需要将他们的乘积除以 50,而这通过简单的移位是不可能的。无论您使用浮点运算还是定点运算,您的计算都不会准确。您必须问自己,您需要多少精度的结果。

要使用定点算法,请将每个传感器值乘以 2 的幂,例如 256。使用 有符号 16 位变量,不要减去任何偏移量。此乘法的结果将有前 8 位表示传感器读数的整数部分,而后 8 位表示传感器读数的不精确小数部分。

将这两个 16 位值相乘以获得带符号的 32 位结果。底部 16 位表示乘积的小数部分。现在,您可以将这些小数位舍入或截断到所需的精度水平。但是你不能说你的精度是 0.02,因为这不是一个合理的二进制值。您的精度必须是 1/2^F 的形式,其中 F 是您在最终答案中保留的小数位数。

【讨论】:

  • 我同意你的评价。如果可以放弃偏移量,这就是要走的路。
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 2020-12-19
  • 1970-01-01
  • 2011-07-08
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多