在两个变量之间进行线性插值a
and b
给定一个分数f
,我目前正在使用这段代码:
float lerp(float a, float b, float f)
{
return (a * (1.0 - f)) + (b * f);
}
我认为可能有一种更有效的方法。我使用的是没有 FPU 的微控制器,因此浮点运算是在软件中完成的。它们相当快,但加法或乘法仍然需要大约 100 个周期。
有什么建议么?
注:为了使上面代码中的方程清晰起见,我们可以省略指定1.0
作为显式浮点文字。
正如 Jason C 在评论中指出的那样,您发布的版本很可能是最佳选择,因为它在边缘情况附近具有卓越的精度:
float lerp(float a, float b, float f)
{
return a * (1.0 - f) + (b * f);
}
如果我们暂时忽略精度,我们可以将表达式简化如下:
a(1 − f) × (b − a)
= a − af + bf
= a + f(b − a)
这意味着我们可以这样写:
float lerp(float a, float b, float f)
{
return a + f * (b - a);
}
在此版本中,我们取消了一次乘法,但失去了一些精度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)