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

C 用定点算法计算浮点数的乘积,c,fixed-point,C,Fixed Point,我有两份工作要做: 我需要在内存中存储两个传感器值(使用FPU) 然后在没有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_

我有两份工作要做:

  • 我需要在内存中存储两个传感器值(使用FPU)
  • 然后在没有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是您在最终答案中保留的分数位数。

    您遇到的问题基本上是,0.2和0.1不能精确表示为二进制分数。将一个值乘以5,另一个值乘以10。在某些情况下,你需要将他们的产品除以50,这是不可能通过简单的转换实现的。无论使用浮点运算还是定点运算,您的计算都不会精确。你必须扪心自问,你对结果的精确度要求有多高

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


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

    请提供一些样本数据-在转换存储之前和之后。除此之外,对于第一步,我将使用
    value=lround((浮点值-偏移)/分辨率)进行“四舍五入”
    当然
    uint8
    对于“分辨率为0.1的介于-10和30之间的值”来说不是很好。尝试
    int16\u t
    。请提供一些样本数据-在转换存储之前和之后。除此之外,对于第一步,我将使用
    value=lround((浮点值-偏移)/分辨率)进行“四舍五入”
    当然
    uint8
    对于“分辨率为0.1的介于-10和30之间的值”来说不是很好。试试
    int16\u t
    。但是我的刻度不能用二进制分数精确表示。如何处理偏移值?我还考虑过将我的“手动缩放”值转换为固定格式的定点数字,如Q8.8,但我还没有找到如何实现这一点的方法,即基数为10,指数为-1,因此在乘法之后,分辨率为10^-1=.1,真的会有10^-2=.01的分辨率,但我的刻度不能用二进制分数精确表示。如何处理偏移值?我也曾考虑过将我的“手动缩放”值转换为固定格式的定点数字,如Q8.8,但我还没有找到如何实现这一点的方法。你的基数为10,指数为-1,因此分辨率为10^-1=.1,因此在乘法后,分辨率将为10^-2=.01我同意你的评估。如果可以取消补偿,这就是出路。我同意你的评估。如果偏移量可以挖沟,那么这就是解决方法。