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?

War es hilfreich?

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 Klasse. Aber dann übergeben Sie das zu einem linearen Löser. Jetzt ist Ihre Arithmetik erfolgt mit integer Division und Ihre Ergebnisse sind falsch. (Ich habe das getan!)

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top