Быстрый квадратичный минимизатор

Дана квадратичная функция, то есть 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;
}

Можно ли сделать лучше?

0

Решение

Не существует «самого быстрого пути», потому что время работы зависит от конкретной машины и конкретного распределения входных параметров. Кроме того, есть немного, что вы можете удалить из исходного кода.

Если расположение экстремума -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 функция.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector