Double Problem im Bezug auf Stellenprüfung
-
Hallo an alle,
ich habe ein kleines Problem. Und zwar habe ich eine Funktion die ein bestimmtes Array oder einen Vector (ist egal) auf spezielle Werte prüft. Das funktioniert bei Integern auch wuderbar, das Problem ist aber, der Double.
Egal ob man 3.49 oder extra 3.49000000000000000 schreibt, es wird immer 3.499999999999999999999 daraus ... jedenfalls meistens, was auch wieder irritierend ist.
Hat jemand eine Idee woran das liegt?
int main( int argc, char* argv[] ) { int i_Val[] = { 7, 88, 36, 12 }; vector<double> dbl_Vec; dbl_Vec.push_back(4.3); dbl_Vec.push_back(17.4); dbl_Vec.push_back(1.3); dbl_Vec.push_back(34.7); for( int i = 0; i < 100; i++ ) if( asm_search<int>(&i_Val[0], &i_Val[(int)sizeof(i_Val)/sizeof(int)], i) ) cout << i << "\tfound in vector list" << endl; cout << nl << endl; for( double d = 0.00000000000000000; d < 40.00000000000000000; (d += 0.10000000000000000) ) { if( FindValue<double>(&dbl_Vec[0], &dbl_Vec[dbl_Vec.size()-1], d) ) cout << d << "\tfound in array" << endl; } return 0; }
-
Fließkommazahlen werden (idR) nicht als Dezimalzahlen gespeichert, sondern mit einer binären Basis. Daher ist die Darstellung als Dezimalzahl nicht immer optimal und du hast oft Rundungsfehler. Daher verwendet man == eigentlich nicht mit Fließkommazahlen. Und deine Schleife ist auch nicht gerade optimal.
Siehe hier, wie man es besser macht:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768Außerdem benutzt du doch offensichtlich C++ und nicht C! (btw. warum nimmst du ein eigenes FindValue und nicht std::find?)
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.