用定点算法计算浮点数的乘积

时间:2018-06-14 21:30:55

标签: c fixed-point

我有两份工作要做:

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

    • 传感器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
    

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

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

2 个答案:

答案 0 :(得分:1)

执行整数乘法,然后将小数乘以刻度的总和。

答案 1 :(得分:1)

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

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

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