Формула синуса использует точки, симметрично распределенные вокруг нуля, а формат косинуса — нет. Особенности формата с плавающей запятой, особенно степень детализации, с которой он представляет числа, симметричны относительно нуля, и поэтому вычисления, симметричные относительно нуля, дают результаты, симметричные относительно нуля.
Формула косинуса использует cos
в точках (2i−1)/(2n+2) π для 1 ≤ i ≤ n+1. Для n=20 эти точки равны 1/42 π, 3/42 π, 5/42 π,… 41/42 π.
1/42 π составляет около 0,075. Наибольшая степень двойки, не превышающая 0,075, равна 2−4. Когда 1/42 π вычисляется в формате IEEE-754 binary64, который имеет 53 бита в мантиссе, масштабирование с плавающей запятой таково, что наибольшая битовая позиция в мантиссе представляет 2−4, а самая младшая битовая позиция представляет 2−56. Таким образом, результат необходимо округлить до ближайшего кратного 2−56. Напротив, 41/42 π составляет около 3,067, и позиция ведущего бита его мантиссы представляет 22, а позиция младшего бита представляет 2−50. Таким образом, результат необходимо округлить до ближайшего кратного 2−50, что в 64 раза больше, чем для 1/42 π. Таким образом, ошибки округления в вычислениях с плавающей запятой обычно различны для 1/42 π и 41/42 π, для 3/42 π и 39/42 π и так далее.
Формула синуса использует sin
в точках (n+2-2i)/(2n+2) π для 1 ≤ i ≤ п+1. Для n=20 эти точки равны 20/42 π, 18/42 π, 16/42 π, … −16/42 π, −18/42 π, −20/42 π. При этом, когда 20/42 π и −20/42 π вычисляются в двоичном формате64, они оба используют одно и то же масштабирование для мантиссы. Таким образом, их ошибки округления идентичны, за исключением знака, и результаты вычислений идентичны, за исключением знакового бита. Точно так же 18/42 π и -18/42 π используют одно и то же масштабирование, и все термины связаны с симметричным партнером, за исключением 0/42 π, но он равен нулю и имеет ошибку вычисления (ноль), которая является симметричной. с собой.
Кроме того, типичные реализации подпрограммы sin
симметричны относительно нуля, так что sin(-x)
и -sin(x)
дают идентичные результаты. Обычно они действуют путем уменьшения аргумента по модулю 2π (по крайней мере, в действительности) и вычисления многочлена, который аппроксимирует синус, и этот многочлен обычно симметричен относительно нуля (имеет все нечетные степени своей переменной x). Таким образом, вычисление sin(x)
и sin(-x)
сохраняет симметрию, как и окончательное умножение на 5. (Реализации cos
могут иметь аналогичную симметрию, но поскольку аргументы в этом случае уже асимметричны, cos
не может восстановить симметрию.)
person
Eric Postpischil
schedule
01.05.2020