https://habr.com/ru/articles/1009424/
Хорошая история про то как легко потерять несколько дней оптимизируя то что уже оптимизировано.
Автор работает над трассировщиком лучей. Профилировщик показывает что
std::asin() вызывается много. Окей, надо ускорить. Пишет аппроксимацию на рядах Тейлора — получает +5%. Неплохо, но точность страдает на краях диапазона. Переходит к аппроксимациям Паде — сложнее, точнее, но скорость та же.Несколько дней работы. Красивые графики погрешностей. Умная математика.
Потом спрашивает LLM — тот выдаёт решение из документации Nvidia CG Toolkit. Продукт не обновлялся с 2012 года. Формула из учебника по математике 1960-х. На Intel быстрее
std::asin() в 1.5–1.9 раза, точность почти идеальная.
double fast_asin(const double x) {
constexpr double a0 = 1.5707288;
constexpr double a1 = -0.2121144;
constexpr double a2 = 0.0742610;
constexpr double a3 = -0.0187293;
const double abs_x = fabs(x);
double p = a3 * abs_x + a2;
p = p * abs_x + a1;
p = p * abs_x + a0;
return copysign(HalfPi - sqrt(1.0 - abs_x) * p, x);
}
Мораль которую сам автор и формулирует честно: он ни разу не остановился и не спросил себя "а может кто-то это уже решил?". Просто начал делать. Решение лежало в мёртвом SDK, который никто уже не помнит. И никто из знакомых разработчиков не подсказал — хотя проект публичный и известный в C++ и графических кругах.
#новость #рендеринг #математика #оптимизация