Ответ 1
Производная от ArcTan(X, Sqrt(1-X*X))
по X равна 1/Sqrt(1-X*X)
. Это продолжается до бесконечности при | X | переходит в 1. Поэтому, когда X близок к 1 или -1, любая ошибка в оценке оказывает огромное влияние на результат. Таким образом, крайне важно, чтобы оценка минимизировала ошибку в этих случаях.
Когда X близок к 1, оценка 1-X
не имеет ошибки (в IEEE 754 или любой хорошей системе с плавающей запятой, поскольку масштаб результата таков, что его младший значащий бит по меньшей мере такой же низкий, как минимум значащий бит в 1 или X, поэтому точный математический результат не имеет битов вне доступных значащих бит). Так как 1-X
является точным, рассмотрим эффект ошибки в 1+X
, рассмотрев производную от ArcTan(X, Sqrt((1-X)*(1+X+e))
по e, где e - ошибка, введенная в операции 1+X
. Производная есть, когда X близок к 1, а е мало, приблизительно -1/10. (Принимая производную с Maple и подставляя 1 для x, получаем -1/(sqrt(4+2e)*(5+2e)
. Тогда подстановка 0 для e дает -1/10.) Таким образом, ошибка в 1+X
не является критичной.
Следовательно, оценка выражения как ArcTan(X, Sqrt((1-X)*(1+X))
является хорошим способом его оценки.
Ситуация симметрична для X вблизи -1. (1+X
не имеет ошибки, а 1-X
не является критическим.)
Обратно, если мы рассмотрим ошибку в X*X
, то производная от ArcTan(X, Sqrt(1-X*X+e))
по e будет, когда X будет около 1, приблизительно -1/(2 * sqrt (e) * (1 + e)), поэтому он большой, когда e мало. Таким образом, небольшая ошибка при оценке X*X
приведет к большой ошибке в результате, когда X близок к 1.
Спросите Паскаля Куока, при оценке функции f (x) нас обычно интересует минимизация относительной ошибки в конечном результате. И, как я уже указывал, ошибки, возникающие во время вычисления, обычно являются относительными ошибками промежуточных результатов из-за округления с плавающей запятой. Я мог проигнорировать это в приведенном выше, потому что я рассматривал функцию, когда X близок к 1, поэтому оба рассматриваемых промежуточных значения (1 + X и X * X) и конечное значение имели величины около 1, поэтому деление значений по этим величинам ничего не изменит.
Однако, для полноты, я более внимательно изучил ситуацию. В Maple я написал g := arctan(x, sqrt((1-x*x*(1+e0))*(1+e1))*(1+e2))
, что позволяет относительные ошибки e0, e1 и e2 в вычислениях X*X
, 1-x*x
и sqrt
соответственно, и я написал h:= arctan(x, sqrt((1-x)*(1+x)*(1+e0))*(1+e2))
для альтернативы. Заметим, что e0 в этом случае объединяет три ошибки в 1-X
, 1+X
и их умножение; полный член ошибки может быть (1+ea)*(1+eb)*(1+ec)
, но это эффективно 1+e0
с большим возможным диапазоном для e0.
Затем я исследовал производные этих функций по (по одному за раз) e0, e1 и e2, деленному на abs (f (x)), где f
была идеальной функцией ArcTan(X, Sqrt(1-X*X))
. Например, в Maple я рассмотрел diff(g, e0) / abs(f(x))
. Я не проводил их полной аналитической оценки; Я изучил значения для некоторых значений x вблизи 0 и около 1 и для значений e0, e1 и e2 в одном из своих пределов -2 -54.
При x около 0 значения были примерно 1 или меньше. То есть любая относительная ошибка в вычислении привела к аналогичной относительной ошибке в результате или меньше.
При x вблизи 1 значения с производными от e1 и e2 были крошечными, около 10 -8 или меньше. Однако значения с производными e0 были сильно различны для двух методов. Для метода 1-x*x
значение было около 2 • 10 7 (с использованием x = 1-2 -53). Для метода (1-x)*(1+x)
значение было около 5 • 10 -9.
Таким образом, эти два метода мало отличаются друг от друга вблизи x = 0, но последний метод значительно лучше вблизи x = 1.