ungenaue ergebniswerte beim rechnen mit double-werten
-
hallo,
ich schreibe gerade an einem programm, das verschiedene formeln benutzt, um aus einer vom benutzer gewählten zusammenstellung von gegebenen werten die möglichen dazugehörigen werte zu errechnen. dabei sind auch einige konstanten im spiel, die ich per define gesetzt habe.
wenn ich jetzt beispielhaft drei vorgegebene werte nehme und sie eingebe, bekomme ich zwar einigermaßen richtige ergebnisse. zum ergebnis mit dem taschenrechner (wo ich die gleichen formeln und die gleichen konstanten benutze) ergeben sich aber teilweise ungenauigkeiten von bis zu 200 pascal oder 10000 einheiten bei der reynoldszahl (es geht um berechnungen für einen windkanal).ich kann mir nicht erklären, woher das kommt. ich hatte zuerst nur float-variablen, hab die dann aber alle auf double gesetzt, da wurde es schon ein bisschen besser. daher rührt meine vermutung, dass es, dadurch dass zum beispiel einige konstanten nur auf eine stelle nach dem komma angegeben sind, während der rechnungen zu irgendwelchen rundungsfehlern kommt. zumal sind gerade die werte, die von vielen anderen vorher errechneten werten abhängen (zum beispiel die erwähnte reynoldszahl, die sich aus 3 werten ergibt) besonders ungenau.
was habt ihr da für erfahrungen gemacht? wie kann ich probieren, die sache zu beheben?
fragt nach, wenn ihr irgendwelchen code sehen wollt, wusste jetzt nicht so recht, was ich davon posten sollte.
-
Erstens mal würde ich in C++ nicht zu
#define
raten, sondern zu konstanten Variablen, also mitconst double
.Zweitens treten beim Rechnen mit Fliesskommazahlen fast immer Rundungsfehler auf, weil sie vom Computer nicht genau dargestellt werden können. Im Forum gibts auch einige Threads dazu, ich bin mir allerdings nicht sicher, ob dein Problem daran liegt (
double
reicht normalerweise schon aus).Etwas Code wär vielleicht nicht schlecht...
-
Rundungdfehler rühren oft daher, dass Fließkommazahlen, die in der Dezimaldarstellung eine endliche Anzahl Nachkommastellen haben, in der Binärdarstellung periodisch sind. Da natürlich nur endlich viel Speicher belegt wird, wird diese binärdarstellung irgendwo abgeschnitten/gerundet -> Rundungsfehler.
-
Wie hat ein gewisser Herr Kosch einmal geschrieben: Zum Schätzen nimmt man Fließkommavariablen, zum Rechnen Integervariablen.
-
wenns garnicht anders geht :
-
Nexus schrieb:
Erstens mal würde ich in C++ nicht zu
#define
raten, sondern zu konstanten Variablen, also mitconst double
.vielen dank, das hab ich beherzigt!
Nexus schrieb:
Etwas Code wär vielleicht nicht schlecht...
ich hab gerade die furchtbare erkenntnis gemacht, dass alles daran lag, dass die iterationsfunktion für die machzahl ziemlicher mist ist. wenn ich dafür den rechner-wert einsetze, stimmt alles überein. hab die brent-iteration aus der "numeric recipes"-sammlung genommen.. kennt jemand ne bessere?