Comments 14
Хм… но ведь полиномы — захардкодженные ряды Тейлора.
А в линейной интерполяции можно выразить синус через косинус (или наоборот) и вдвое уменьшить объем памяти.
0
полиномы — захардкодженные ряды Тейлора.
Не обязательно. Другой вариант — интерполяционный полином Лагранжа. Разница будет в том, где именно будет достигаться требуемая точность. Обрезанные ряды Тейлора хорошо работают около нуля (чем дальше, тем хуже), полиномы Лагранжа — на интервале, где брали опорные точки.
+1
Еще можно попробовать прием, основанный на формуле синуса тройного или пятерного угла.
Делим первоначальный угол на какую-нибудь степень тройки или пятерки, пользуемся приближением sin(x) = x, а потом применяем формулу многократно, чтобы вернуться к первоначальному углу.
sin(3x) = 3 sin(x) - 4 sin³(x)
sin(5x) = 5 sin(x) - 20 sin³(x) + 16 sin⁵(x)
Делим первоначальный угол на какую-нибудь степень тройки или пятерки, пользуемся приближением sin(x) = x, а потом применяем формулу многократно, чтобы вернуться к первоначальному углу.
0
UFO just landed and posted this here
А нельзя адаптировать gsl_sf_sin из GSL? Да, их реализации не такие быстрые (экспонента где-то в три раза медленнее), но работают хорошо во всех диапазонах.
0
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 не слишком большие таблицы.
Если задать табличную форму для аргумента x с некоторым шагом, а y — расстояние от ближайшего шага до текущего значения (можно в плюс и в минус), а потом повторить ещё раза 2, до тех пор, пока в пределах представления не будут удовлетворяться соотношения (sin x=x, cos x=1), то алгоритм будет линейным и не будет зависеть от входного аргумента.
Далее, любой аргумент можно привести к диапазону от 0 до pi/4.
Итого надо 2-3 не слишком большие таблицы.
0
Неужели не существует родного даблового синуса на куде?..
+2
А почему интерполяция только линейная? Ведь еще можно было бы как то учесть производные высших порядков. хотя бы кривыми Безье
0
Мне нужна была точность в районе 15 порядков + скорость не меньше 33% от оригинальной. Я не в курсе как делается интерполяция кривыми Безье и какой получится результат по скорости и точности потому что цель минимум достигнута. Но если Вы сделаете это, протестируете и скинете результат, я, если это возможно, дополню публикацию.
0
Степень полинома можно снизить если ограничиться диапазоном 0..Pi/2.
0
Вау, вы переизобрели LUT. Которые (в частности, для тригонометрических функций) используются еще с самой зари трехмерной графики.
+1
Sign up to leave a comment.
Функция Math.Sin (double) для GPU