Pull to refresh

Comments 14

Хм… но ведь полиномы — захардкодженные ряды Тейлора.
А в линейной интерполяции можно выразить синус через косинус (или наоборот) и вдвое уменьшить объем памяти.

UFO just landed and posted this here
полиномы — захардкодженные ряды Тейлора.


Не обязательно. Другой вариант — интерполяционный полином Лагранжа. Разница будет в том, где именно будет достигаться требуемая точность. Обрезанные ряды Тейлора хорошо работают около нуля (чем дальше, тем хуже), полиномы Лагранжа — на интервале, где брали опорные точки.
Еще можно попробовать прием, основанный на формуле синуса тройного или пятерного угла.

sin(3x) = 3 sin(x) - 4 sin³(x)
sin(5x) = 5 sin(x) - 20 sin³(x) + 16 sin⁵(x)


Делим первоначальный угол на какую-нибудь степень тройки или пятерки, пользуемся приближением sin(x) = x, а потом применяем формулу многократно, чтобы вернуться к первоначальному углу.

Несколько операций накопит ошибок больше IEEE

UFO just landed and posted this here
А нельзя адаптировать gsl_sf_sin из GSL? Да, их реализации не такие быстрые (экспонента где-то в три раза медленнее), но работают хорошо во всех диапазонах.
Думаю можно. Если адаптируешь, протестируешь скорость и точность и скинешь результаты, если можно — я внесу в публикацию результат твоей работы + оставлю ссылку что ты автор.
sin(x+y) = sin x cos y + cos x sin y
Если задать табличную форму для аргумента x с некоторым шагом, а y — расстояние от ближайшего шага до текущего значения (можно в плюс и в минус), а потом повторить ещё раза 2, до тех пор, пока в пределах представления не будут удовлетворяться соотношения (sin x=x, cos x=1), то алгоритм будет линейным и не будет зависеть от входного аргумента.
Далее, любой аргумент можно привести к диапазону от 0 до pi/4.
Итого надо 2-3 не слишком большие таблицы.

Неужели не существует родного даблового синуса на куде?..

А почему интерполяция только линейная? Ведь еще можно было бы как то учесть производные высших порядков. хотя бы кривыми Безье
Мне нужна была точность в районе 15 порядков + скорость не меньше 33% от оригинальной. Я не в курсе как делается интерполяция кривыми Безье и какой получится результат по скорости и точности потому что цель минимум достигнута. Но если Вы сделаете это, протестируете и скинете результат, я, если это возможно, дополню публикацию.
Степень полинома можно снизить если ограничиться диапазоном 0..Pi/2.
Вау, вы переизобрели LUT. Которые (в частности, для тригонометрических функций) используются еще с самой зари трехмерной графики.
Sign up to leave a comment.

Articles