Как компьютер считает синусы

Как компьютер считает синусы

Два способа: готовые таблицы и точный расчёт

Это текст про математику и компьютеры. Если тема интересна, посмотрите также на математический тренажёр Практикума — он бесплатный и интерактивный. 

А сейчас — про синусы.

Что такое синус и зачем он нужен? 

Вульгарное объяснение: синус — это математическая коробка, в которую засовывают любое число, а она в ответ выдаёт числа от −1 до 1. Если эти числа выстроить подряд на некой оси, то получится кривая вот такого вида:

Как компьютер считает синусы

Как читать эту кривую: если затолкать в коробку «sin» число, примерно равное 1,57, то коробка выдаст число, близкое к единице. Если затолкать число 2, на выходе будет примерно 0,909. Если затолкать примерно 3,14 — вернёт примерно 0. Синус от 4,712 даст примерно −0,999. И так дальше: число может быть сколько угодно большим, а синус всегда будет возвращать какие-то дробные значения от −1 до 1.

Это число взято из тригонометрии — то есть из науки, которая занимается углами и сторонами треугольника. В частности, синус описывает отношение сторон прямоугольного треугольника: насколько один из катетов (короткая сторона треугольника) короче, чем гипотенуза (длинная сторона треугольника). Но чаще всего мы знаем не длины сторон, а угол между ними, поэтому в синусы всегда запихивают значения углов.

Грубо говоря, вы говорите коробке: «Коробка, у меня тут прямоугольный треугольник. Я смотрю на его острый угол, он равен 30º. Что ты мне на это скажешь»? А коробка отвечает: «Если у тебя угол 30º, то короткая сторона твоего треугольника вдвое короче, чем длинная гипотенуза. Так что sin(30º) = ½». 

Это число нужно много где в математике и компьютерах. Например, без синуса невозможно соединить две точки прямой линией на плоскости. Люди это делают без труда с помощью линейки, а компьютеру нужно очень чётко считать, куда поставить пиксель, и для этого нужен синус.

Помимо синуса есть ещё три аналогичные функции — косинус, тангенс и котангенс. Они такие же по принципу работы, но описывают отношения других сторон.

Во многих языках программирования есть встроенная команда нахождения синуса угла — sin(). Внутри этой функции зашита какая-то логика для нахождения этого числа. 

Чаще всего, когда не нужна высокая точность, компьютер берёт значения синуса из готовых таблиц — он находит там нужный угол и возвращает значение, ничего не вычисляя. Это быстро и достаточно точно для бытовых вычислений. Вы наверняка использовали его в школе, когда считали синусы по таблице Брадиса. 

Но когда нужна высокая точность вычислений (например, 20 знаков после запятой), то синусы и другие тригонометрические функции высчитывают каждый раз с нуля. Для этого используют много разных алгоритмов, и самый простой из них — использование рядов Тейлора.

Как компьютер считает синусы
Таблица Брадиса, по которой компьютер находит значения синусов с точностью 4 знака после запятой

Что такое ряд Тейлора

Брук Тейлор — это английский математик из 17-го века, в честь которого назвали формулу, связывающую значение функции и значение всех её производных в выбранной точке. Если сильно упростить и перевести на понятный язык, то формула будет звучать так:

Представим, что значение функции, например, синуса — это круг, заполненный на 100%. Производная функции в этой точке — это часть круга:

Как компьютер считает синусы

Есть производные первого порядка в этой точке, второго, третьего и так до бесконечности. Каждая производная следующего порядка добавляет в круг сектор поменьше:

Как компьютер считает синусы

Если сложить все производные до бесконечности, то получим полный круг — это и будет значение синуса:

Как компьютер считает синусы

В общем виде ряд Тейлора функции выглядит так:

Как компьютер считает синусы

Для каждой функции ряд Тейлора выглядит по-своему. Для синуса он выглядит так:

Как компьютер считает синусы

Выглядит сложно. Но если разложить эту формулу сумму в понятный вид, она будет выглядеть так:

Как компьютер считает синусы

Восклицательный знак — это факториал. Это просто произведение всех целых чисел до этого числа. Например: 5! = 1 × 2 × 3 × 4 × 5 = 120.

Получается, что компьютеру для нахождения синуса достаточно использовать умножение — и для факториала, и для возведения в степень. Зная это, можно написать простой алгоритм.

Точность расчётов

Особенность ряда Тейлора в том, что это бесконечный ряд — а значит, и вычисления тоже придётся делать бесконечно. Чтобы обойти это ограничение, используют погрешность — с какой точностью нам нужно посчитать значение формулы. Для этого делают так:

  • Определяем точность, например 7 знаков после запятой.
  • Минимальное число из 7 знаков после запятой — это 0,0000001. Это и будет наша погрешность.
  • Считаем очередное слагаемое ряда Тейлора.
  • Если это слагаемое меньше нашей погрешности — прибавляем и останавливаемся, потому что мы достигли нужного результата. Если не меньше — продолжаем.

С таким подходом можно найти синус любого угла с любой точностью, главное, чтобы у компьютера хватило памяти на все эти вычисления.

Радианы

Чтобы использовать ряд Тейлора для вычисления синуса, нам нужно перевести градусы в радианы. Радиан — это мера измерения углов в тригонометрии, которая привязана к числу π. 

Радианы с углами связаны так:

1 радиан = 180/π градусов

Получается, что для того, чтобы перевести углы в градусах в радианы, нам нужно градусы разделить на 180 и умножить на π. 

Теперь мы знаем всё, чтобы написать код вычисления синуса на Python

Пишем код

Логика алгоритма будет такая:

  • спрашиваем градусы;
  • спрашиваем погрешность, с которой нужно вычислить синус;
  • в цикле считаем очередное слагаемое ряда Тейлора и прибавляем его к общей сумме;
  • если очередное слагаемое меньше погрешности — останавливаемся и выводим результат.

Читайте комментарии, чтобы разобраться в коде, а потом запустите его у себя, чтобы проверить результаты:

# импортируем математическую библиотеку, чтобы взять оттуда модуль и число пи
import math

# объявляем свою функцию, которая посчитает синус
def computerSinus (x,n):
 
    # переводим градусы в радианы
    x = x/180*math.pi
    # для проверки выведем результат, который посчитает компьютер
    print(str(math.sin(x)) + " — результат вычислений встроенного синуса")
    
    # сразу берём x как первое слагаемое ряда Тейлора
    q = x
    # сумма ряда на старте равна нулю
    s = 0
    # порядковый номер слагаемого в ряду Тейлора
    i = 1

    # пока очередное слагаемое больше погрешности — цикл работает
    while abs(q) > n:
        # добавляем слагаемое к общей сумме
        s = s + q
        # вычисляем следующее слагаемое
        q = q* (-1) * (x*x) / ((2*i+1) * (2*i))
        # увеличиваем порядковый номер слагаемого в ряду Тейлора
        i = i+1  
    # возвращаем сумму как результат работы функции
    return s
 
# запрашиваем стартовые значения
x = float(input("Введите градусы: "))
n = float(input("Введите погрешность: "))
# выводим результат, который мы посчитали сами
print(str(computerSinus(x,n)) + " — синус, который мы посчитали")
Как компьютер считает синусы

Что дальше

В следующий раз попробуем сделать то же самое с квадратным корнем — посмотрим, как компьютер сможет посчитать его без таблиц.

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Виталий Вебер

Любите математику? Это для вас
Попробуйте бесплатный тренажер «Основы математики для цифровых профессий». Это все необходимые знания, чтобы закрыть пробелы в математике для айтишника.
Попробовать бесплатно
Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Чем отличается авторизация от аутентификации
Чем отличается авторизация от аутентификации

Как усложнить жизнь злоумышленникам.

medium
Что такое SaaS, IaaS, XaaS и всё остальное
Что такое SaaS, IaaS, XaaS и всё остальное

И сорт авокадо Хаас

easy
Использовать чужой код стыдно?

Стыдно — когда видно

easy
Что такое обфускация кода
Что такое обфускация кода

Когда код специально запутывают так, чтобы было непонятно, как он работает

easy
Можно ли стать разработчиком, если учиться по вечерам
Можно ли стать разработчиком, если учиться по вечерам

Текст о стратегии обучения в сфере ИТ

easy
Что такое эмулятор
Что такое эмулятор

Ваш пропуск в мир винтажных приставок и хакерских игрушек

easy
Парное программирование: что это такое и стыдно ли это
Парное программирование: что это такое и стыдно ли это

9 вопросов про парное программирование

easy
Как устроены файлы
Как устроены файлы

Главный способ хранения всех данных

easy
Кодирование и шифрование — в чём разница?
Кодирование и шифрование — в чём разница?

Одно делается для удобства, а другое — для защиты.

easy
Дизайнер в ИТ: зачем он нужен и как им стать
Дизайнер в ИТ: зачем он нужен и как им стать

Нестыдные вопросы, в том числе — нужно ли уметь рисовать.

easy
medium