Forum: PC Hard- und Software C++ double to int cast


von Werner (Gast)


Lesenswert?

Hallo C/C++ Freunde,

warum ergibt
1
(int) (4.06 * 100)

405 ?

Wie komme ich auf das richtige Ergebnis 406?
Werner

von Tom (Gast)


Lesenswert?

Wahrscheinlich weil 4.06 in Wahrheit 4.05irgendwas ist.

Was ergibt denn 4.06*10000 im Integer-Cast?

von Werner (Gast)


Lesenswert?

Mit Faktor 1000: 4059,
Faktor 10000: 40599,
Faktor 100000: 405999

von float (Gast)


Lesenswert?

Ist zwar nur float, aber: 4.06 ist 4.059999942779541015625.
Ich mag die Seite ganz gern: 
https://www.h-schmidt.net/FloatConverter/IEEE754de.html

von Dirk B. (dirkb2)


Lesenswert?

(int) (4.06 * 100 + 0.01)

von paul (Gast)


Lesenswert?

(int) (4.06 * 100 + 0.005)

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

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:
1
    int x1 = (int)(4.06 * 100);
2
    int x2 = (int)(4.06 * 100.0);
3
    int x3 = (int)((double)4.06 * (double)100.0);
4
    int x4 = (int)round(4.06 * 100.0);
5
6
    printf("%d %d %d %d\n", x1, x2, x3, x4);

siehe auch:
- https://en.cppreference.com/w/cpp/numeric/math/round

: Bearbeitet durch User
von gamp (Gast)


Lesenswert?

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.

von foobar (Gast)


Lesenswert?

> (int) (4.06 * 100 + 0.01)
> (int) (4.06 * 100 + 0.005)

Wohl eher:
  (int)(4.06 * 100 + 0.5)

von KM (Gast)


Lesenswert?

> (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

von Justin S. (Gast)


Lesenswert?

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.

von mh (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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.

von mh (Gast)


Lesenswert?

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ß?

von Εrnst B. (ernst)


Lesenswert?

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.

von mh (Gast)


Lesenswert?

Ε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?

von Εrnst B. (ernst)


Lesenswert?

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.

von mh (Gast)


Lesenswert?

Ε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.

von Axel S. (a-za-z0-9)


Lesenswert?

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 ...

von mh (Gast)


Lesenswert?

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.