#java #c# #sof
Изучаю Java и заинтересовался работой метода sin (cos). Заметил, что скорость получения синуса на j меняется в зависимости от аргумента функции. Если угол меньше 0.785... рад, то вычисляет быстро, а если больше - соответственно, медленно. Сравнил с C#, получилось примерно наоборот: Проверял в миллисекундах за 10 млн вычислений синуса. Почему результаты таковы? Вот результат для косинуса/синуса java от 0 до 4*pi: public static void main(String[] args) { long a; for (double x = 0; x < 4 * Math.PI; x = x + 0.05) { a = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { //Math.cos(x); Math.sin(x); } System.out.printf("%.6f, %d \n", x, (System.currentTimeMillis() - a)); } } Вот результат для косинуса/синуса C# от 0 до 4*pi: public static void Main(string[] args) { for (double x = 0; x < 4 * Math.PI; x = x + 0.05) { Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 10000000; i++) { Math.Cos(x); // Math.Sin(x); } sw.Stop(); Console.WriteLine(x +" - " +(sw.ElapsedMilliseconds).ToString()); } }
Ответы
Ответ 1
По C# не скажу точно, но по Java — всё выглядит так: Синус вычисляется через Сишную библиотеку. Исходники для OpenJDK здесь. Для аппроксимации синуса используется полином 13-й степени (что-то типа Чебышева). При этом для величин аргумента менее PI/4=0.785 вычисляется истинный синус. Если аргумент больше PI/4 вычисляется уже через косинус, который аппроксимируется уже полиномом 14-й степени, оттуда и происходит скачок на графике. Скорее всего, с C# история аналогичная, только используется другая библиотека.
Комментариев нет:
Отправить комментарий