Дана квадратичная функция, то есть f(x) = ax^2 + bx + c
какой самый быстрый способ найти x
в [-1, 1]
который сводит к минимуму 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
, sgn
а также setsgn
функции, вы можете использовать что-то вроде
a*= -2;
if (hack_abs(b) >= hack_abs(a))
return hack_setsgn(1, hack_sgn(a) ^ hack_sgn(b));
return b / a;
Вы также можете попробовать с более портативным copysign
функция.