Вычислить функции синуса и косинуса с точностью
Как рассчитать синус и косинус функции с некоторой точностью в Java?
Потому что стандарт sin
а также cos
не позволяет делать это.
2 ответа
Вы можете использовать разложение в ряды Тейлора sin и cos для вычисления их с произвольной точностью:
Разложение Тейлора (или, точнее, разложение Маклаурена, то есть Тейлора около x=0) не является хорошим способом сделать этот расчет. Большинство компьютеров используют алгоритм CORDIC - он имеет преимущество в том, что сходится к произвольной точности за конечное число итераций и требует только очень простой математики.
Еще одна вещь, которую нужно иметь в виду: вы действительно хотите начать с точного способа уменьшить параметр x
находиться в диапазоне [0 пи /2], заботясь о знаке ответа, используя простую логику. Когда x становится большим, расширение Маклаурена (Тейлора) будет колебаться в течение очень долгого времени.
Это означает, среди прочего, что вам нужно знать ценность pi
по крайней мере, количество цифр вашего желаемого ответа, плюс еще много цифр вам нужно уменьшить x
(потому что если x = 1000000, вам нужно еще 6 цифр числа пи, чтобы получить ответ с достаточной точностью в сокращенной области).
В конечном итоге у вас будет меньше цифр точности в вашем результате, чем точности ваших вычислений - согласно приведенному выше источнику, с 64-битным удваиванием ваше число увеличивается в точности для 48 итераций алгоритма (примерно 1 в 2^48 точности). Так как значение для двойного равно 53 битам, это на самом деле не так уж плохо (в пределах 5 битов точности, используемой в вычислениях).
Java-реализация алгоритма может быть найдена в этом предыдущем ответе. Было бы интересно посмотреть, как это соотносится с расширением Тейлора...
РЕДАКТИРОВАТЬ эту статью сравнивает сходимость CORDIS и расширения Тейлора и приходит к выводу, что Тейлор работает быстрее, когда вы работаете в редуцированной области (поэтому после введения x в [0 pi/2]). Он также имеет довольно аккуратную переформулировку, которая позволяет обойти множество ошибок округления, что делает его более точным, чем грубая оценка условий.