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

1,00
р.
Изучаю 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
", 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()) } }

Ответ
По C# не скажу точно, но по Java — всё выглядит так:
Синус вычисляется через Сишную библиотеку FDLIB. Исходники здесь. Для аппроксимации синуса используется полином 13-й степени (что-то типа Чебышева). При этом для величин аргумента менее PI/4=0.785 вычисляется истинный синус. Если аргумент больше PI/4 вычисляется уже через косинус, который аппроксимируется уже полиномом 14-й степени, оттуда и происходит скачок на графике.
Скорее всего, с C# история аналогичная, только используется другая библиотека.