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ą)?
Odpowiedzi:
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.
źródło
pi
nie jest stałą matematycznąπ
, ale bliskim przybliżeniem zmiennoprzecinkowym.exp
Funkcja 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.