Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Отличие в скорости вычисления тригонометрических функций в Java и C#

#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# история аналогичная, только используется другая библиотека.

Комментариев нет:

Отправить комментарий