Les dérivés de l' ArcTan(X, Sqrt(1-X*X))
par rapport à X est 1/Sqrt(1-X*X)
. Cela va à l'infini comme |X| passe à 1. Par conséquent, lorsque X est proche de 1 ou -1, toute erreur dans l'évaluation a un effet énorme sur le résultat. Ainsi, il est essentiel que l'évaluation de minimiser les erreurs dans ces cas.
Lorsque X est proche de 1, l'évaluation de l' 1-X
a pas d'erreur (dans la norme IEEE 754 ou tout bon flottante, système de point, parce que l'échelle de la résultat est tel que son bit le moins significatif est au moins aussi bas que le bit le moins significatif dans 1 ou X, donc l'exact résultat mathématique n'a pas de bits à l'extérieur de la disposition significande bits). Depuis 1-X
est exact, prendre en compte l'effet de l'erreur en 1+X
en considérant la dérivée de ArcTan(X, Sqrt((1-X)*(1+X+e))
à l'égard à e, où e est l'erreur introduite dans l' 1+X
de l'opération. Le dérivé est, lorsque X est proche de 1 et e est faible, d'environ -1/10. (Prenant la dérivée avec de l'Érable et de la substitution de 1 pour x rendements en -1/(sqrt(4+2e)*(5+2e)
. Ensuite, la substitution de 0 pour e les rendements -1/10.) Ainsi, l'erreur en 1+X
n'est pas critique.
Par conséquent, l'évaluation de l'expression en tant que ArcTan(X, Sqrt((1-X)*(1+X))
est une bonne manière de l'évaluer.
La situation est symétrique pour X proche de -1. (1+X
a pas d'erreur, et 1-X
n'est pas critique.)
A l'inverse, si l'on considère l'erreur en X*X
, la dérivée de ArcTan(X, Sqrt(1-X*X+e))
à l'égard de e est, lorsque X est proche de 1, environ -1/(2*sqrt(e)*(1+e)), de sorte qu'il est grand lorsque e est petit. Donc une petite erreur dans l'évaluation de la X*X
sera la cause d'une grosse erreur dans le résultat, lorsque X est proche de 1.
Demandez Pascal Cuoq, lorsque l'évaluation d'une fonction f(x), nous sommes généralement intéressés à minimiser l'erreur relative dans le résultat final. Et, comme je l'ai souligné, les erreurs qui se produisent lors du calcul sont généralement relative des erreurs dans les résultats en raison de l'arrondi à virgule flottante. J'ai été capable de l'ignorer dans le ci-dessus parce que j'étais considérons la fonction lorsque X est proche de 1, donc, à la fois les valeurs intermédiaires en cours d'examen (1+X et X*X) et la valeur finale avait grandeurs proche de 1, donc en divisant les valeurs de ces grandeurs ne pas changer quoi que ce soit de manière significative.
Toutefois, pour être complet, j'ai examiné la situation de plus près. En d'Érable, j'ai écrit g := arctan(x, sqrt((1-x*x*(1+e0))*(1+e1))*(1+e2))
, permettant ainsi d'erreurs relatives e0, e1 et e2 dans les calculs de x*x
, 1-x*x
, et l' sqrt
, respectivement, et j'ai écrit h:= arctan(x, sqrt((1-x)*(1+x)*(1+e0))*(1+e2))
pour l'alternative. Notez que e0, dans ce cas, combine les trois erreurs en 1-x
, 1+x
, et la multiplication d'entre eux, le terme d'erreur pourrait être l' (1+ea)*(1+eb)*(1+ec)
, mais c'est bien ce qu' 1+e0
avec un plus grand éventail possible de e0.
Ensuite, j'ai examiné les dérivés de ces fonctions à l'égard de (un à la fois) e0, e1 et e2 divisé par l'abs(f(x)), où f
a la fonction idéale, arctan(x, sqrt(1-x*x))
. E. g., en d'Érable, j'ai examiné diff(g, e0) / abs(f(x))
. Je n'ai pas d'effectuer un plein analytique de l'évaluation de ceux-ci; j'ai examiné les valeurs pour certaines valeurs de x proche de 0 et proche de 1 et pour les valeurs de e0, e1 et e2 dans l'un de leurs limites, -2-54.
Pour x proche de 0, les valeurs étaient tous de grandeur de 1 ou moins. C'est, un parent, une erreur dans le calcul donné lieu à une semblable erreur relative dans le résultat, ou moins.
Pour x proche de 1, les valeurs avec les dérivés de e1 et e2 ont été minuscule, environ 10-8 ou moins. Toutefois, les valeurs avec les dérivés de e0 étaient très différentes pour les deux méthodes. Pour l' 1-x*x
méthode, la valeur était d'environ 2•107 (à l'aide de x = 1-2-53). Pour l' (1-x)*(1+x)
méthode, la valeur était d'environ 5•10-9.
En résumé, les deux méthodes ne diffèrent pas beaucoup près de x = 0, mais cette dernière méthode est bien plus près de x = 1.