我有两份工作要做:
我的传感器是:
为了有效地存储数据,我使用偏移量和比例因子将值转换为整数
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
现在我遇到了第二项任务的一些问题。我需要在不使用浮点运算的情况下计算这两个值的乘积。
我该怎么做?我已经看过定点数,它提供了通过整数乘法和移位进行乘法的可能性。 但我似乎无法弄清楚如何将我的缩放值转换为定点数。
答案 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是您在最终答案中保留的分数位数。