Bester Basistyp zu behandeln linearen Algebra
-
23-08-2019 - |
Frage
Ich bin eine kleine und unzureichende lineare Algebra-Bibliothek in C ++ für ein Projekt zu schreiben (tut mir leid). Ich bin die Umsetzung Matrizen und Operationen mit doppelter Genauigkeit Zahlen. Ich mache nicht wahr? Sollte ich stattdessen eine Template-Klasse implementieren? Gibt es eine präzisere Art um?
Lösung
Ich habe eine C ++ Bibliothek für lineare Algebra mit Hilfe von Vorlagen geschrieben. Mein Gedanke war, dass wir komplexe Zahlen oder erweiterter Genauigkeit Zahlen eines Tages verwenden möchten. Das war vielleicht vor sieben Jahren, und wir haben es noch nicht getan. Wir verwenden fast immer doppelt als Template-Typ, und wir haben typedefs zu, dass einfach.
Ein paar Male, die wir den anderen Weg gegangen sind, mit Typen kleine als ein Doppelzimmer. Zum Beispiel haben wir Schwimmer eher als das Doppelte in einem Speicher-gebundene Anwendung beschrieben hier verwendet . Aber 99,9 Prozent der Zeit, die wir verdoppeln verwenden.
Wenn Sie eine Vorlage Argument verwenden zu tun, achten Sie auf Verwendung eines Integer-Typ, aber implizit erfordern eine Gleitkomma-Typ. Zum Beispiel, sagen, Sie haben eine Matrix, deren Einträge alle ganzen Zahlen und so verwenden Sie eine Matrix
Andere Tipps
Ich würde die Klasse / Struktur implementieren eine Vorlage. Am Anfang werden Sie wahrscheinlich mit nur double
zufrieden sein, aber ich habe, dass in jedem Projekt gefunden, wo ich nicht implementieren Matrizen als Vorlagen, ich bereute es später.
Auch es gibt Ihnen die Möglichkeit interessante Element-Algebren zu verwenden -. Intervallarithmetik, Wahrscheinlichkeitsverteilungen, komplexe Mathematik, Festpunktspiel, Untermatrizen, einfache mathematische :-), etc
Ich schreibe eine kleine und unzureichende lineare Algebra-Bibliothek in C ++ für ein Projekt (tut mir leid)
AUTSCH! Seien Sie vorsichtig, sehr sehr vorsichtig ... Check out JAMA / TNT - es ist bekam die NIST Stempel-of-Zulassung auf sie und sie haben bereits einige der „einfacheren“ lineare Algebra Mathematik zB behandelt verschiedene Factoring-Algorithmen. Lineare Algebra beinhaltet viele schwierige Probleme mit numerischen Präzision (zB Hilbert-Matrizen ) und so viel wie ich mein eigenes Ding wie zu tun ist dies einer jener Bereiche, in denen Sie eine gute solide Grundlage verwenden mögen, die bereits gut getestet worden ist.
Es soll möglich sein, lange zu verwenden, damit verdoppeln (nicht ganz sicher, dass), aber die Algorithmen selbst sind wahrscheinlich wichtiger als die Genauigkeit der Matrizen.
Letzte Frage Antwort: Ja, es ist, es heißt long double
und ist mindestens so präzise wie double
. Denn ob Vorlagen verwenden oder nicht, ja ich würde Vorlagen verwenden. Das ist eine große usecase für sie, und ich denke, es wird zu einer anderen Skalarzahl Art machen Portierung einfacher. Sie können dann typedef auch nur einen Schwimmer und / oder eine doppelte Matrix, je nach System, das Sie laufen auf und die man arbeitet schneller / besser da.
Nehmen Sie keine zusätzliche Arbeit nicht für sich selbst. Wenn Sie mit Doppel erhalten, indem (oder long double) gehen damit.
Es klingt wie dies nur ein kleines Projekt ist, wobei in diesem Fall die Vorlage Sache wird nur Arbeit für Sie.
Eine weitere Option, die eine Vorlage diskutiert verwendet zu definieren Ihren Elementtyp nicht. Das macht nicht viel bewirken, wenn überhaupt, zusätzliche Arbeit, sondern ermöglicht es einige Änderungen später.
Es gibt keine andere Art präziser als long double die auch Hardware-Unterstützung hat . Aber Sie sind frei, Ihre eigene Art zu machen, wenn Sie die Notwendigkeit für mehr Präzision fühlen. Sie werden jedoch als recht langsamer als der native Doppeltyp, auch mit umfangreicher Optimierung.