[anfänger] vergleich von zwei double-werten
-
hallo,
ich schreib grad ein kleines programm und eine radiokarte anzusteuern, die sender speichere ich in einer datei ab:
sender \tab frequenz
zuerst hatte ich für die frequenz float verwendet, aber dann ging alles daneben, dann habe ich double verwendet, dann klappt soweit alles wunderbar.
jetzt das problem:
wenn ich die frequenz ändere durchsuche ich meine struktur und vergleiche die frequenzen um an den sendernamen zu kommen:
struct sender_s { char name[32]; double freq; } sender[10]; double aktuell; int i; for(i=0; i < 10; i++) { if(sender[i].freq == aktuell) { // mach was break; } }
nur der vergleich der double werte funktionier nicht immer, keine ahnung warum. wenn ich die double werte mit rint() umwandle dann funktioniert is immer.
kann mir jemand sagen warum das so ist?
-
Hallo,
das funktioniert deswegen nicht, weil Gleitkommazahlen intern nicht korrekt
dargestellt werden koennen. So wirst du bei einem 'double i = 2.74' wahrscheinlich
nie nur '2.74' sondern '2.74000083' oder sowas haben. Was du daher machen
kannst, ist einfach die Nachkommastellen in den Vorkommaanteil zu bringen.
Da double 8 Nachkommastellen hat, multiplizierst du deine Zahl einfach mal
100000000. Aus '2.74000083' wird dann 274000083 und ein Vergleich sollte ohne
Probleme funktionieren.Das Problem haben wir bei uns auf der Arbeit uebrigens auch gehabt, allerdings
mit float. Bei float muss man halt mit 10000 multiplizieren um den Nachkommaanteil
in den Vorkommaanteil zu bekommen.Hoffe ich konnte dir helfen.
mfg
v R
-
ahaa, ja, jetzt ist klar.
frage: hängt die sache auch vom system ab (prozessor, verwendete c-library) ? oder bin ich mit *100000000 immer auf der sicheren seite?
-
Hallo,
damit solltest du immer auf der sicheren Seite sein.
Ich wuesste nicht, wie man es sonst machen koennte, zumindest faellt mir im
Moment keine andere Moeglichkeit ein.mfg
v R