2016-09-04 3 views
2

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.

+1

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? –

+0

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. –

+0

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. –

Antwort

3

Für C, bitte prüfen Sie Anhang G in C99 oder C11. Zumindest GCC folgt dem, ich wäre überrascht, wenn das nicht klingeln würde.

Für C++, IIRC hat der C++ - Standard beschlossen, C99/C11 Annex G nicht zu integrieren, und die Algorithmen für komplexe mult/div sind bis zur Implementierung.

Der Fortran-Standard legt nicht fest, wie komplexe Multiplikationen oder Divisionen implementiert werden müssen. Zur Division verwendet GFortran die allgemeine Smith-Methode (1962), außer wenn -ffast-math angegeben wird, dann wird der naive Algorithmus verwendet.

Für einen Vergleich verschiedenen Algorithmen für komplexe Division Berechnung finden Sie in http://arxiv.org/abs/1210.4539

+1

Dies könnte auch von Interesse sein: Claude-Pierre Jeannerod, Nicolas Louvet und Jean-Michel Muller, "Über die komponentenweise Genauigkeit der komplexen Gleitkommadivision mit einem FMA". In * Proceedings des 21. IEEE-Symposiums über Computer-Arithmetik (ARITH 21) *, 7. April 2013, S. 83-90 ([online] (http://www.acs-lab.com/arithmetic/arith21/papers/ p23.pdf)) sowie: Douglas M. Priest, "Effiziente Skalierung für komplexe Teilung." * ACM-Transaktionen mit mathematischer Software (TOMS) * 30.4 (2004): 389-401. ([online, Paywall] (http://dl.acm.org/citation.cfm?id=1039814)) – njuffa

+0

Danke, das ist, was ich gesucht habe. Also ist C die Sprache für wissenschaftliches Rechnen! Obwohl Anhang G optional ist, wird zumindest angegeben, wie komplex Arithmetik ist. C++ und Fortran sind eigentlich enttäuschend ... –

Verwandte Themen