如何对浮点进行线性插值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

给定分数f,在两个变量之间进行线性插值ab,我正在使用以下代码:

float lerp(float a, float b, float f) 
{
    return (a * (1.0 - f)) + (b * f);
}

我想可能有更有效的方法。我使用的是一个没有FPU的微控制器,所以浮点操作是在软件中完成的。它们的速度相当快,但它仍然是大约100个循环的加或乘。

有什么建议吗?

提问于
用户回答回答于

不考虑精度上的差异,该表达式相当于

float lerp(float a, float b, float f)
{
    return a + f * (b - a);
}
用户回答回答于

最快的解决方案就是用整数来计算所有的数学。

下面是我使用的一个函数:

inline uint16_t unsignedInterpolate(uint16_t a, uint16_t b, uint16_t position) {
    uint32_t r1;
    uint16_t r2;

    /* 
     * Only one multiply, and one divide/shift right.  Shame about having to
     * cast to long int and back again.
     */

    r1 = (uint32_t) position * (b-a);
    r2 = (r1 >> XY_TABLE_FRAC_BITS) + a;
    return r2;    
}

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问12 回答
  • 四无君

    0 粉丝0 提问3 回答
  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问2 回答
  • o o

    3 粉丝490 提问2 回答

扫码关注云+社区

领取腾讯云代金券