In der realen Fließkomma-Arithmetik haben wir die zusätzlichen Symbole INF (Unendlichkeit), NAN und die vorzeichenbehaftete Nullstelle. Für komplexe Berechnungen ist dies schwieriger. Nutzt man die "naive" Regeln für die Multiplikation und Divisionkomplexe Multiplikation/Divison mit Unendlichkeit und Nan
(a + ib)(c + id) = (ac - db) + i(ac+bd)
(a + ib)/(c + id) = ((ac + db) + i(ac-bd))/(c*c + d*d)
ein falsch bekommt (*) Ergebnisse für fast alle Fälle, in denen, wo eine Variable a, b, c, d INF oder NAN ist.
Zum Beispiel
- (1 + i 0) * (INF + i0) = INF + inan. Im Vergleich zur realen Arithmetik 1 * INF = INF
- (0 + i1) * (NAN + i0) = NAN + iNAN. Jedoch würde man erwarten, dass i * NAN = (0 + iNAN)
- 1/(0 + 0i) = NAN + iNAN. Dies bricht zum Beispiel z = 1/(1/z), was in reeller Arithmetik perfekt funktioniert.
Diese Liste könnte leicht weitergehen.
Die Frage ist, wie man die komplexe Division und Multiplikation richtig implementiert, so dass alle Fälle, auch wenn einer von Real- oder Imaginärteil INF und NAN ist, aussagekräftige Ergebnisse liefern? Gibt es auch Programmiersprachen, die korrektes Verhalten für komplexe Arithmetik mit INF und NAN garantieren?
EDIT: Ich würde gerne wissen, welche Programmiersprache Standard (Version) erfordert korrekte komplexe Arithmetik mit INF und NAN. Die Sprachen, die mich am meisten interessieren würden, sind die Familien C, C++ und FORTRAN.
(*) falsch in dem Sinne, dass es mathematisch nicht sinnvoll ist oder im Sinne von IEEE-754 kontraintuitiv ist.
In welchem Zusammenhang? Welche Sprache? [Hier] (http://llvm.org/svn/llvm-project/libcxx/trunk/include/complex) ist clangs C++ '' Implementierung. Wenn Sie sich die Implementierung 'operator *' anschauen, wird gezeigt, wie INF/NaN gehandhabt wird. Was stimmt nicht überein? –
Sie scheinen es richtig zu machen. Danke für den Link. Meine Frage ist, welche Sprache es garantiert., D. H. In welcher Sprache die Spezifikation das korrekte INF- und NAN-Verhalten vorschreibt. Meiner Kenntnis nach ist dies bei C++ nicht der Fall (aber ich könnte falsch liegen). FORTRAN scheint es auch nicht zu verlangen. Hier möchte ich Klarheit haben. –
Die Sache ist, wenn Sie portablen Code schreiben wollen, der auf die Verarbeitung von INF und NAN angewiesen ist, ist es sinnlos, wenn einige Compiler es richtig machen und andere nicht. –