快速二次最小化器

Fast quadratic minimizer

本文关键字:二次 最小化      更新时间:2023-10-16

给定一个二次函数,即f(x) = ax^2 + bx + c,在[-1, 1]中找到x并使f(x)最小的最快方法是什么?

到目前为止,这是我想出的函数:

double QuadraticMinimizer(double a, double b, double c) {   
    double x = 1 - 2*(b > 0);
    if (a > 0) {
        x = -b/(2*a);
        if (fabs(x) > 1)
            x = Sign(x);
    }
    return x;
}

有可能做得更好吗?

没有"最快的方法",因为运行时间取决于特定的机器和输入参数的特定分布。而且,您可以从初始代码中删除的内容不多。

如果极值-b/2a的位置经常落在区间[-1,1]之外,在这种情况下可以避免除法。

如果你允许从浮点表示中破解符号位来实现快速的abs, sgnsetsgn函数,你可以使用像

这样的东西
a*= -2;
if (hack_abs(b) >= hack_abs(a))
  return hack_setsgn(1, hack_sgn(a) ^ hack_sgn(b));
return b / a;

您也可以尝试使用更便携的copysign函数