Hallo C/C++ Freunde, warum ergibt
1 | (int) (4.06 * 100) |
405 ? Wie komme ich auf das richtige Ergebnis 406? Werner
|
Forum: PC Hard- und Software C++ double to int castHallo C/C++ Freunde, warum ergibt
405 ? Wie komme ich auf das richtige Ergebnis 406? Werner Wahrscheinlich weil 4.06 in Wahrheit 4.05irgendwas ist. Was ergibt denn 4.06*10000 im Integer-Cast? Ist zwar nur float, aber: 4.06 ist 4.059999942779541015625. Ich mag die Seite ganz gern: https://www.h-schmidt.net/FloatConverter/IEEE754de.html float schrieb: > Ist zwar nur float, aber: 4.06 ist 4.059999942779541015625. Das ist genau so einer dieser Werte wo das einfache abschneiden der Nachkommastellen nicht zum Ziel führt. Zum ausprobieren:
siehe auch: - https://en.cppreference.com/w/cpp/numeric/math/round :
Bearbeitet durch User
Wenn so die Anforderungen sind, sollte man besser mit Festkommazahlen arbeiten. Oder eben immer korrekt runden, bevor ge-castet wird, so wie es schon von Paul beschrieben wurde. > (int) (4.06 * 100 + 0.01) > (int) (4.06 * 100 + 0.005) Wohl eher: (int)(4.06 * 100 + 0.5) > (int) (4.06 * 100 + 0.01) > (int) (4.06 * 100 + 0.005) > (int)(4.06 * 100 + 0.5) Leute das Ding heisst: int x = lround(4.06*100); Öfters mal in die Referenz schauen: https://en.cppreference.com/w/c/numeric/math/round foobar schrieb: >> (int) (4.06 * 100 + 0.01) >> (int) (4.06 * 100 + 0.005) > > Wohl eher: > (int)(4.06 * 100 + 0.5) Korrekt auf eine ganze Zahl gerundet, aber leider nur für positive Zahlen. Justin S. schrieb: > Korrekt auf eine ganze Zahl gerundet, aber leider nur für positive > Zahlen. Es gibt nicht die eine korrekte Art zu Runden. float schrieb: > Ist zwar nur float, aber: 4.06 ist 4.059999942779541015625. Als double ist es 4.0599999999999996092014953319448977708816528320312500 Die nächstgrößere als double darstellbare Zahl ist 4.0600000000000004973799150320701301097869873046875000 Die erste von beiden ist aber die bessere Näherung. Yalu X. schrieb: > ls double ist es > > 4.0599999999999996092014953319448977708816528320312500 > > Die nächstgrößere als double darstellbare Zahl ist > > 4.0600000000000004973799150320701301097869873046875000 Da sieht man, dass die + 0.01 noch viel zu groß sind. Dirk B. schrieb: > Yalu X. schrieb: >> ls double ist es >> >> 4.0599999999999996092014953319448977708816528320312500 >> >> Die nächstgrößere als double darstellbare Zahl ist >> >> 4.0600000000000004973799150320701301097869873046875000 > > Da sieht man, dass die + 0.01 noch viel zu groß sind. Für was ist 0.01 zu groß? mh schrieb: > Für was ist 0.01 zu groß? er sucht vmtl. std::numeric_limits<double>::epsilon Allerdings muss das noch entsprechend hochskaliert werden. Εrnst B. schrieb: > mh schrieb: >> Für was ist 0.01 zu groß? > > er sucht vmtl. > std::numeric_limits<double>::epsilon > Allerdings muss das noch entsprechend hochskaliert werden. Und wofür will er das vermutlich gesuchte epsilon verwenden? mh schrieb: > Und wofür will er das vermutlich gesuchte epsilon verwenden? um die kleinste Zahl zu finden, die er zu 4.0599999999999996092014953319448977708816528320312500 dazuaddieren muss, um auf "4.06" zu kommen. Εrnst B. schrieb: > mh schrieb: >> Und wofür will er das vermutlich gesuchte epsilon verwenden? > > um die kleinste Zahl zu finden, die er zu > 4.0599999999999996092014953319448977708816528320312500 > dazuaddieren muss, um > auf "4.06" zu kommen. Welches praktische Problem löst das? Ok, es ist eine Antwort auf die Frage des TO, wenn auch wenig hilfreich. mh schrieb: > Εrnst B. schrieb: >> er sucht vmtl. >> std::numeric_limits<double>::epsilon > Und wofür will er das vermutlich gesuchte epsilon verwenden? Um es mit Null zu vergleichen? Mathemathikerwitz: Sei epsilon gleich Null ... Axel S. schrieb: > mh schrieb: >> Εrnst B. schrieb: > >>> er sucht vmtl. >>> std::numeric_limits<double>::epsilon > >> Und wofür will er das vermutlich gesuchte epsilon verwenden? > > Um es mit Null zu vergleichen? > > Mathemathikerwitz: Sei epsilon gleich Null ... Haha ... witzig ... Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
|
|