Gast
#6978333
Hallo, wie vergleiche ich am einfachsten zwei Float-Zahlen aber nur bis zur ersten oder zweiten Nachkommastelle?
1 | |
2 | |
3 | |
4 | |
loop:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Danke
|
Anzeige
|
zwei float-Zahlen vergleichen / 1..2 Nachkommastellen
Gast
#6978333
Hallo, wie vergleiche ich am einfachsten zwei Float-Zahlen aber nur bis zur ersten oder zweiten Nachkommastelle?
loop:
Danke
Gast
#6978335
Mit 100 multiplizieren und als int vergleichen. Kann man, wenn es vom Wertebereich her passt. Wenn es geht, drängt sich der Verdacht auf, ob es nicht gleich besser wäre alles in ganzen Zahlen zu rechnen (oder Festkomma) - das war aber nicht gefragt zugegebenermaßen. Ansonsten sowas wie fabs( a - b )<0.01...
Gast
#6978355
Werner schrieb: > Mit 100 multiplizieren und als int vergleichen. irgendwie so?:
hm, muss wohl mal den float typ studieren, vielleicht geht es mit so einem bit shift operator ....
Gast
#6978365
epika2 schrieb: > Werner schrieb: > >> Mit 100 multiplizieren und als int vergleichen. > > irgendwie so?: >
> > hm, muss wohl mal den float typ studieren, vielleicht geht es mit so > einem bit shift operator .... Sinnvoller wäre es beim Zuweisen von temp und damit wohl auch indirekt bei lastTemp direkt auf (unsigned) int oder short zu gehen, oder brauchst du das irgendwo wirklich als float? https://www.mikrocontroller.net/articles/Festkommaarithmetik
Gast
#6978374
epika2 schrieb: > if( ( (int)temp*100 ) != ( (int)lastTemp*100 ){ So ähnlich, aber mit Rundung if( (int)(temp*100 + 0.5 ) != (int)(lastTemp*100 + 0.5 ) {
Gast
#6978380
Erich schrieb: > epika2 schrieb: >> if( ( (int)temp*100 ) != ( (int)lastTemp*100 ){ > > So ähnlich, aber mit Rundung > if( (int)(temp*100 + 0.5 ) != (int)(lastTemp*100 + 0.5 ) { Die Klammerung stimmt nun schon mal, aber die Rundung funktioniert so nur für positive Zahlen. Der TO wollte eine Temperatur bis zur 2. Nachkommastelle vergleichen, da ist eine Rundung von tausendstel auf hundertstel Grad sicherlich nicht notwendig.
Gast
#6978386
Rolf schrieb: > Erich schrieb: >> epika2 schrieb: >>> if( ( (int)temp*100 ) != ( (int)lastTemp*100 ){ >> >> So ähnlich, aber mit Rundung >> if( (int)(temp*100 + 0.5 ) != (int)(lastTemp*100 + 0.5 ) { > > Die Klammerung stimmt nun schon mal, aber die Rundung funktioniert so > nur für positive Zahlen. > > Der TO wollte eine Temperatur bis zur 2. Nachkommastelle vergleichen, da > ist eine Rundung von tausendstel auf hundertstel Grad sicherlich nicht > notwendig. Diese Rundung macht auch sonst keinen Sinn... Erich schrieb: > So ähnlich, aber mit Rundung > if( (int)(temp*100 + 0.5 ) != (int)(lastTemp*100 + 0.5 ) { Bevor ich zweimal in float addiere und multipliziere und nach int konvertiere, nur um dann rasend schnell ganzzahlig zu vergleichen), habe ich doch die Differenz in float gleich schneller berechnet...
Gast
#6978392
Klaus W. schrieb: > Ansonsten sowas wie fabs( a - b )<0.01... Die schlaueste Lösung, kommt auch mit Rundungsfehlern klar.
Gast
#6978394
MaWin schrieb: > Klaus W. schrieb: >> Ansonsten sowas wie fabs( a - b )<0.01... > > Die schlaueste Lösung, kommt auch mit Rundungsfehlern klar. Nein, die schlaueste Lösung ist und bleibt das Problem nicht mit Floats zu lösen.
Gast
#6978400
Erich schrieb: > So ähnlich, aber mit Rundung > if( (int)(temp*100 + 0.5 ) != (int)(lastTemp*100 + 0.5 ) { Nur um es für den TO deutlich zu machen (obwohl es andere schon gesagt haben): Runden ist niemals sinnvoll für einen Vergleich. Weder implizit durch Wandlung auf int noch explizit per round. Die einzige wirksame Methode ist jene von Klaus: Test ob die Differenz kleiner als erlaubt ist.
Gast
#6978430
Tim T. schrieb: > brauchst du das irgendwo wirklich als float? bei der Anzeige der Temperatur, ja:
folgender Code funktioniert irgendwie nicht, auch nicht bei positiven Werten
das mit fabs() kenne ich nicht, muss ich mir mal anschauen. vielen Dank epika schrieb: > folgender Code funktioniert irgendwie nicht, auch nicht bei positiven > Werten > if( ((int)temp*100+0.5) != ((int)lastTemp*100+0.5) ){ Hier machst du aus temp erst eine int (dann sind die Nachkommastellen weg!), dann multiplizierst du mit 100 . davon kommen die Nachkommastellen nicht zurück. Dann noch wieder in float 0.5 zu addieren, ist sinnlos, aber auch schon egal, ebenso wie der Rest. epika schrieb: > Tim T. schrieb: >> brauchst du das irgendwo wirklich als float? > > bei der Anzeige der Temperatur, ja: >
Auch da nicht. Man kann auch mit Cent rechnen und trotzdem Euro ausgeben - ohne float. > folgender Code funktioniert irgendwie nicht, auch nicht bei positiven > Werten >
Achte auf die Klammerung!
> das mit fabs() kenne ich nicht, muss ich mir mal anschauen.
unbedingt.
Hallo, epika schrieb: > das mit fabs() kenne ich nicht, muss ich mir mal anschauen. Du bildest die Differenz beider Werte. Das Ergebnis kann positiv, negativ oder null sein. Interessant ist aber nur der Betrag also der absolute Wert, den du mit fabs() bildest. Diesen Betragswert vergleichst du jetzt mit einem "Genauigkeitswert" (wird meist als epsilon bezeichnet). Ist der Betragswert gleich oder kleiner als der "Genauigkeitswert", gelten die ursprünglichen Werte als gleich. Wie genau die beiden Werte übereinstimmen müssen um als gleich zu gelten, kannst du mit dem "Genauigkeitswert" vorgeben. Je kleiner dieser Wert ist desto genauer stimmen die ursprünglichen Werte überein. rhf
Gast
#6978460
epika schrieb: > Tim T. schrieb: >> brauchst du das irgendwo wirklich als float? > > bei der Anzeige der Temperatur, ja: >
Nein, auch da kannst du als Int ausgeben und das Komma einfach an die richtige Stelle setzen. > folgender Code funktioniert irgendwie nicht, auch nicht bei positiven > Werten >
Der Code ist auch Unsinn, lass die unsinnige Rundung weg. > das mit fabs() kenne ich nicht, muss ich mir mal anschauen. > > vielen Dank fabs macht eigentlich nichts anderes als:
Gast
#6978464
Ich habe auch viel mit Temperaturen zu tun. Deshalb rechne ich intern nur in Zehntel Grad als Integer. Die Genauigkeit reicht in der Anwendung. Das erspart Rechnerei, insbesondere auf Controllern ohne FPU. Nur bei der Ausgabe auf Bildschirm muss dann etwas gemacht werden. und das würde auch nur mit Mod und Div gehen. Tim T. schrieb: > fabs macht eigentlich nichts anderes als: Genau genommen macht fabs() das mit doubles. Das fabs() für float heißt fabsf()... (Wenn man es nicht verwirrend machen würde, könnte es ja jeder.)
Gast
#6978470
Klaus W. schrieb: > Tim T. schrieb: >> fabs macht eigentlich nichts anderes als: > > Genau genommen macht fabs() das mit doubles. > Das fabs() für float heißt fabsf()... Stimmt, hast recht. > (Wenn man es nicht verwirrend machen würde, könnte es ja jeder.) Könnte da noch
anbieten, aber auch da ist es eigentlich schon zu leicht. epika schrieb: > Tim T. schrieb: >> brauchst du das irgendwo wirklich als float? > > bei der Anzeige der Temperatur, ja:
Das heißt, du hast ein eigenes print, das Nachkommastellen kennt? Dann gibt es doch garkeinen Grund mehr für float. Für den Zweck hab' ich mein printf aufgebohrt. Für 2 Kommastellen sieht das so aus ;)
Gast
#6978487
Bauform B. schrieb: > Das heißt, du hast ein eigenes print, das Nachkommastellen kennt? Dann > gibt es doch garkeinen Grund mehr für float. Für den Zweck hab' ich mein > printf aufgebohrt. Für 2 Kommastellen sieht das so aus ;)
Mal eben aus dem Rückenmark:
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|