@cpp_beginner

Расскажите пожалуйста как реализован sin в cmath?

Препод в универе задал изучить реализацию синуса в библиотеке cmath но как такового кода я не нашел, или плохо искал или что то не понимаю, через ряд тейлора не вариант при больших значениях угла ряд медленно сходится, но если не так то тогда как?
  • Вопрос задан
  • 290 просмотров
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
кода я не нашел, или плохо искал

вот код из glibc.

через ряд тейлора не вариант при больших значениях угла ряд медленно сходится

В приведённой реализации сначала аргумент приводится к диапазону ±pi/2, потом берётся фиксированное число слагаемых ряда тейлора.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
SET_RESTORE_ROUND_53BIT (FE_TONEAREST);
Настройка сопроцессора. Это какая-то магия, имеющая две задачи: производительность и повторяемость.

Дальше мы залезаем в устройство числа (причём для краткости имеем дело с 32-битными командами!) и проверяем на «малость» — если получилось малое, то sin x ≈ x.

Дальше идёт проверка на |x|≲45° — идёт вычисление настоящего синуса. Опять-таки, проверка по верхним 32 битам числа (синус вычисляем по всем 64 битам ☺️).

Если число не очень большое, мы загоняем его в диапазон ±45° и вычисляем синус или косинус.

Если число побольше — идёт более злой загон в диапазон ±45° и то же самое.

И последнее, что осталось,— ∞/NaN.

Внутренние функции обозревать не буду, но что мы тут видим?
1. Какие значения бывают чаще, какие реже?
2. Для очень маленьких значений sin x ≈ x, cos x ≈ 1.
3. Ещё одно — залезание во внутренний формат компьютерного дробного, причём даже на x64 имеем дело с 32-битными целыми.
4. Даже функция приведения в ±45° есть в двух видах — упрощённом и «злом» в зависимости от абсолютной величины числа.
Ответ написан
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы