Найти в Дзене

Как искал быстрый asin() и нашёл его в документации 2012 года

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; r

Как искал быстрый asin() и нашёл его в документации 2012 года

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++ и графических кругах.

#новость #рендеринг #математика #оптимизация