繁体   English   中英

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

[英]Calculate product of floating point numbers with fixed point arithmetic

我有两个工作要做:

  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

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

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

执行整数乘法,然后将小数位数乘以小数位和。

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

要使用定点算法,请将每个传感器值乘以2的幂,即256。使用有符号的 16位变量,并且不要减去任何偏移量。 该相乘的结果将具有代表传感器读数的整数部分的高8位和代表传感器读数的不精确小数部分的低8位。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM