Pourquoi l'expression exp (i * pi) renvoie-t-elle le mauvais résultat dans GNU Octave?

8

J'ai commencé à apprendre GNU Octave aujourd'hui, et j'ai essayé la première expression donnée dans le manuel

exp(i*pi)

Le résultat est

ans = -1.0000e+000 + 1.2246e-016i

Et il semble que la bibliothèque scientifique GNU donne également des résultats similaires.

Est-ce donc un bug d'Octave, ou des problèmes généraux de logiciel d'analyse numérique (un logiciel d'évaluation symbolique donnera certainement une réponse exacte)?

Siyuan Ren
la source
2
Semble octave est principalement destiné à l'analyse numérique. Mathematica vous donnerait certainement une meilleure réponse ...: P plaisantant juste ... Essayez de chercher une solution d'analyse symbolique GNU
gd1
@Giacomo: Je le sais. Je me demande simplement si tous les logiciels d'analyse numérique évaluent un tel nombre, ou simplement GNU Octave.
Siyuan Ren
@Karsus Ren ce n'est pas en fait un bug logiciel, mais matériel. C'est une limitation inhérente d'essayer d'évaluer des expressions avec des nombres irrationnels sur du matériel avec une quantité limitée de stockage pour un seul numéro.
Percée

Réponses:

8

Ce n'est pas un bogue non plus, mais en raison de la façon dont les ordinateurs effectuent les opérations en virgule flottante. Il y a une précision limitée avec laquelle n'importe quel ordinateur peut fonctionner, et vous verrez donc parfois des anomalies comme celle-ci. Bien qu'il soit possible d'écrire un logiciel capable de gérer cela, cela prendrait beaucoup plus de temps de calcul et augmenterait considérablement les besoins en mémoire.

Si vous le regardez, e ^ (i * pi) renvoie -1 + 1,2x10 ^ -16i. Comme vous pouvez le voir, la composante imaginaire est extrêmement petite (la plupart la considéreraient comme négligeable, car elle est 16 ordres de grandeur plus petite que la partie réelle). Ce composant est introduit par des erreurs d'arrondi et de précision, à la fois avec le calcul lui-même, ainsi qu'avec la valeur stockée de pi car il est irrationnel (voir ce lien pour un autre exemple traitant des nombres irrationnels).

Si cette erreur de calcul est inacceptable, vous devez rechercher des packages mathématiques qui effectuent une analyse symbolique plutôt que numérique, ou ceux qui utilisent des nombres à virgule flottante de haute précision . Les mises en garde sont qu'elles augmenteront considérablement vos besoins en mémoire, et l'analyse symbolique est souvent beaucoup plus lente. De plus, des nombres de précision plus élevés réduiront simplement l'amplitude des erreurs d'arrondi / précision, et non les élimineront.

Percée
la source
1
J'ai juste besoin d'une confirmation que c'est le comportement commun des logiciels d'analyse numérique.
Siyuan Ren
@Karsus Ren c'est en fait le comportement de ce type de logiciel avec une précision suffisamment élevée . Je sais que cela semble contre-intuitif, mais les nombres de précision inférieure ne renvoient pas ces anomalies aussi souvent. Consultez cet article de Microsoft pour plus de détails, mais n'oubliez pas que ce problème est une combinaison du code source et de l'architecture compilateur / cible. En outre, cet article Wikipedia contient de bonnes informations générales sur le problème.
Percée
1
Le problème sous-jacent est que la constante d'Octave pin'est pas la constante mathématique π, mais une approximation à virgule flottante proche de celle-ci. La expfonction ajoute une autre petite erreur à cela. Un système qui fonctionne avec des expressions symboliques pourrait calculer exp(i*pi)exactement; Octave n'est pas un tel système.
Keith Thompson