49,1K подписчиков

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

2K прочитали

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Радианы

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

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

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

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

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

Пишем код

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

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

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

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

Что дальше

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