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)?
Réponses:
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.
la source
pi
n'est pas la constante mathématiqueπ
, mais une approximation à virgule flottante proche de celle-ci. Laexp
fonction ajoute une autre petite erreur à cela. Un système qui fonctionne avec des expressions symboliques pourrait calculerexp(i*pi)
exactement; Octave n'est pas un tel système.