首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >浮点线性插值

浮点线性插值
EN

Stack Overflow用户
提问于 2010-12-04 20:41:29
回答 6查看 67.5K关注 0票数 44

为了在给定分数f的情况下在两个变量ab之间进行线性插值,我目前使用以下代码:

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

我认为可能有一种更有效的方法。我使用的是没有FPU的微控制器,所以浮点运算是在软件中完成的。它们相当快,但仍然需要大约100个周期才能进行加法或乘法。

有什么建议吗?

注:为了使上面代码中的方程式清晰,我们可以省略将1.0指定为显式浮点文字。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-04 20:43:57

忽略精度上的差异,该表达式等同于

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

这是2个加法/减法和1个乘法,而不是2个加法/减法和2个乘法。

票数 35
EN

Stack Overflow用户

发布于 2014-01-27 19:11:46

如果你在一个没有FPU的微控制器上,那么浮点运算将会非常昂贵。对于浮点运算来说,很容易就会慢20倍。最快的解决方案是使用整数来完成所有的数学运算。

固定二进制点(http://blog.credland.net/2013/09/binary-fixed-point-explanation.html?q=fixed+binary+point)后的位数是: XY_TABLE_FRAC_BITS。

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

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;    
}

使用内联函数,它应该是近似的。10-20个周期。

如果你有一个32位微控制器,你将能够使用更大的整数,并在不影响性能的情况下获得更大的数字或更高的精度。此函数用于16位系统。

票数 9
EN

Stack Overflow用户

发布于 2010-12-04 21:12:30

如果您正在为不带浮点操作的微控制器编写代码,那么最好不要使用浮点数,而是使用fixed-point arithmetic

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4353525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档