Multiple precision problem
-
Hallo,
Ich möchte folgendes Problem lösen:
double a0,b0,c0,a1,b1,c1,t1,t2; // TODO: Use an exact type ... t1=(a0-c0) * (b1-c1); t2=(a1-c1) * (b0-c0); if(t1<t2) cout << "t1<t2"<<endl; else if (t1>t2) cout<< "t1>t2"<<endl; else cout<<"t1==t2"<<endl;Da die Präzision von einem gewöhnlichen Double nicht ausreicht, sollen
a0,b0,c0,a1,b1,c1 einen exakten Typ haben, mit dem t1 und t2 berechnet
und der Vergleich zuverlässig durchgeführt werden kann. Nun scheint es
aber so, daß man bei MPFR bzw. GMP die Präzision vorgeben muß, mit der
gerechnet wird. Die kann aber doch beliebig hoch sein..Ideen, wie man das löst? Ich habe bisher nicht mit multiple precision
libraries gearbeitet, vielleicht gibts da einen Trick?Danke, lg
-
Du wirst dich schon auf eine bestimmte Genauigkeit festsetzen müssen. Denn absolute genauigkeit geht nicht.
Ansonten könntest du z.B. Pi mit allen Stellen speichern.
Oder um es noch einfacher zu zeigen:
x = 1 / 3
Nun ist x 0,3333333333333333333333333333333333333333333333333333333333...
Du würdest nun unendlich Speicher benötigen um diese Zahl in einem Komma Format zu speichern.
-
Osbios schrieb:
Du wirst dich schon auf eine bestimmte Genauigkeit festsetzen müssen. Denn absolute genauigkeit geht nicht.
Ansonten könntest du z.B. Pi mit allen Stellen speichern.
Oder um es noch einfacher zu zeigen:
x = 1 / 3
Nun ist x 0,3333333333333333333333333333333333333333333333333333333333...
Du würdest nun unendlich Speicher benötigen um diese Zahl in einem Komma Format zu speichern.
Auch 1/3 geht: Hier rechnet man mit rationalen Zahlen. Die scheinen übrigens
die Lösung für mein Problem zu sein. Ich lese gerade die Doku.
-
Ja, was ist denn das Problem überhaupt? Eventuell kann man das ja auch anders lösen.
Ich erinnere mich da an früher, wo ich ein Least-Squares-Problem über das Normalgleichungssystem gelöst habe. Später habe ich gelernt, dass das numerisch eine sehr schlechte Idee ist, weil man sich so die Genauigkeit kaputt macht. Ich hatte mit dem Ansatz auch Genauigkeitsprobleme. Alternativ kann man das ursprüngliche Gleichungssystem per Householder-Transformationen auf Dreiecksgestalt bringen und dann direkt lösen. Das ist numerisch viel besser. Es ist nur ein Beispiel dafür, dass man nicht unbedingt mega-genaue Zahlentypen braucht. Ein gescheiter Ansatz/Algorithmus tut's manchmal auch.
