Dlaczego wyrażenie exp (i * pi) zwraca nieprawidłowy wynik w GNU Octave?

8

Dzisiaj zacząłem uczyć się GNU Octave i wypróbowałem pierwsze wyrażenie podane w instrukcji

exp(i*pi)

Wynik to

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

Wydaje się, że Biblioteka Naukowa GNU również daje podobne wyniki.

Czy to jest błąd Octave, czy ogólne problemy z oprogramowaniem do analizy numerycznej (program do oceny symbolicznej na pewno da odpowiedź dokładnie taką)?

Siyuan Ren
źródło
2
Wydaje się, że oktawa jest pierwotnie przeznaczona do analizy numerycznej. Mathematica na pewno dałaby lepszą odpowiedź ...:
Żartuję
@Giacomo: Wiem o tym. Zastanawiam się tylko, czy całe oprogramowanie do analizy numerycznej ocenia taką liczbę, czy tylko GNU Octave.
Siyuan Ren
@Karsus Ren to nie jest błąd programowy, ale sprzętowy. Jest to nieodłączne ograniczenie próby oceny wyrażeń o nieracjonalnych liczbach na sprzęcie z ograniczoną ilością miejsca dla pojedynczej liczby.
Przełom

Odpowiedzi:

8

Nie jest to żaden błąd, ale ze względu na sposób, w jaki komputery wykonują operacje zmiennoprzecinkowe. Dokładność, z jaką może współpracować każdy komputer, jest ograniczona, dlatego czasami zobaczysz takie anomalie. Chociaż można napisać oprogramowanie, które sobie z tym poradzi, zajęłoby to znacznie więcej czasu obliczeniowego i drastycznie zwiększyło zapotrzebowanie na pamięć.

Jeśli spojrzysz na to, e ^ (i * pi) zwraca -1 + 1,2x10 ^ -16i. Jak widać, wyimaginowany komponent jest niezwykle mały (większość uważa go za nieistotny, ponieważ jest o 16 rzędów wielkości mniejszy niż część rzeczywista). Ten komponent jest wprowadzany przez błędy zaokrąglania i precyzji, zarówno w samym obliczeniu, jak i przechowywanej wartości pi, ponieważ jest nieracjonalny (zobacz ten link w innym przykładzie dotyczącym liczb niewymiernych).

Jeśli ten błąd obliczeniowy jest niedopuszczalny, powinieneś przyjrzeć się pakietom matematycznym, które wykonują raczej analizę symboliczną niż liczbową lub te, które używają precyzyjnych liczb zmiennoprzecinkowych . Z zastrzeżeniem tego, że drastycznie zwiększą wymagania dotyczące pamięci, a analiza symboliczna jest często znacznie wolniejsza. Ponadto, liczby o wyższej precyzji po prostu zmniejszają wielkość błędów zaokrąglania / precyzji, a nie eliminują je.

Przełom
źródło
1
Potrzebuję tylko potwierdzenia, że ​​jest to powszechne zachowanie oprogramowania do analizy numerycznej.
Siyuan Ren,
@Karsus Ren to zachowanie tego rodzaju oprogramowania z wystarczająco dużą precyzją . Wiem, że wydaje się to sprzeczne z intuicją, ale liczby o niższej precyzji nie zwracają tych anomalii tak często. Więcej informacji można znaleźć w tym artykule od firmy Microsoft , ale pamiętaj, że ten problem jest kombinacją zarówno kodu źródłowego, jak i architektury kompilatora / docelowego. Ponadto ten artykuł z Wikipedii zawiera kilka dobrych informacji na temat problemu.
Przełom
1
Podstawowym problemem jest to, że stała Octave'a pinie jest stałą matematyczną π, ale bliskim przybliżeniem zmiennoprzecinkowym. expFunkcja dodaje inny mały błąd do tego. System działający z wyrażeniami symbolicznymi mógłby obliczyć exp(i*pi)dokładnie; Oktawa nie jest takim systemem.
Keith Thompson,