2017-07-02 11 views
0

Was ist der einfachste Weg, alle Eigen::MatrixXd s und Eigen::VectorXd s mit Vektoren und Matrizen zu ersetzen, die long double Elemente haben?Substitutionen für Eigen :: MatrixXd typedefs

Jede grundlegende Gleitkommavariable in meinem Code ist vom Typ long double. Außerdem verwende ich jedes Mal, wenn ich eine Matrix oder einen Vektor verwende, die folgenden typedefs.

typedef Eigen::VectorXd Vec; 
typedef Eigen::MatrixXd Mat; 

Was ist das Beste, um diese Typdefs zu wechseln? Was passiert, wenn ich sie so belasse wie sie sind?

+0

Die wichtigere Frage ist jedoch, brauchen Sie wirklich 'long double'? Es kann alle Ihre Berechnungen erheblich verlangsamen, da die meisten Prozessoren so gebaut sind, dass sie schnell "doppelt" rechnen können. Es könnte auch sein, dass Ihr Compiler einfach "long double" ignoriert und stattdessen "double" verwendet. Lies den [Wikipedia Artikel] (https://en.wikipedia.org/wiki/Long_double) und denke nochmal darüber nach. –

Antwort

2

Definieren Sie einfach Ihre eigenen Typedefs basierend auf Eigen global matrix typedefs.

Wenn Sie Eigen::MatrixXd verwenden und füllen Sie es mit Elementen des Typs long double, werden diese Werte in die verengte double Elemente der Matrix passen, was zu einem Verlust an Präzision führt oder, im schlimmsten Fall, Überlauffehler. Bei vielen Architekturen wird Gleitkomma-Arithmetik mit doppelter Genauigkeit in 80-Bit-Extended-Genauigkeit ausgeführt, so dass die Ergebnisse identisch sein können. Darauf sollten Sie sich sicher nicht verlassen! Für mehr siehe z. B. long double vs double.

#include <Eigen/Core> 

typedef Eigen::Matrix< long double, Eigen::Dynamic, 1    > Vec; 
typedef Eigen::Matrix< long double, Eigen::Dynamic, Eigen::Dynamic > Mat; 

int main() 
{ 
    long double ld = 2; 

    Mat m(1,1); 
    m(0,0) = ld; 
} 
+0

danke. Ich habe diesen Link gesehen und über den Unterschied zwischen 'long double' als ersten Template-Parameter und 'std :: complex ' nachgedacht. Und ich werde mich um die andere Sache kümmern, danke – Taylor