Mathematisches Runden
-
Hi Leute,
ich hab jetzt einige Threads dazu überflogen, finde aber keine befriedigende Antwort. Gibt es tatsächlich in C++ keine bereits bereitgestellte funktion mit der man eine double zahl mathematisch runden und in einen Integer casten kann?
-
Meinst du etwa
double d = 1.23; int gerundet = d+0.5;Wo liegts Problem?

-
Freddy_Kay schrieb:
Hi Leute,
ich hab jetzt einige Threads dazu überflogen, finde aber keine befriedigende Antwort. Gibt es tatsächlich in C++ keine bereits bereitgestellte funktion mit der man eine double zahl mathematisch runden und in einen Integer casten kann?
Doch, klar.
ceil und floor.
Die sind total mathematisch sogar.Willst Du kaufmännisch runden?
-
out schrieb:
Meinst du etwa
double d = 1.23; int gerundet = d+0.5;Wo liegts Problem?

dafür muss ich vorher die größe der double selbst prüfen. Dann kann ich auch händisch runden.
volkard schrieb:
Freddy_Kay schrieb:
Hi Leute,
ich hab jetzt einige Threads dazu überflogen, finde aber keine befriedigende Antwort. Gibt es tatsächlich in C++ keine bereits bereitgestellte funktion mit der man eine double zahl mathematisch runden und in einen Integer casten kann?
Doch, klar.
ceil und floor.
Die sind total mathematisch sogar.Willst Du kaufmännisch runden?
im Prinzip selbes problem. Ich muss vorher selbst prüfen welchen Wert die double hat. Was ich suche ist eine "vorimplementierte" Funktion. Die soll dann folgendes machen:
2,3 ≈ 2
2,5 ≈ 3
2,7 ≈ 3
2,0 ≈ 2
2,999999 ≈ 3 usw.Gibt es so eine Funktion bereits oder muss ich das selbst bauen? Wenn sich das kaufmänisch runden nennt, dann bitte ich meine Wortwahl zu entschuldigen
-
-
Freddy_Kay schrieb:
out schrieb:
Meinst du etwa
double d = 1.23; int gerundet = d+0.5;Wo liegts Problem?

dafür muss ich vorher die größe der double selbst prüfen. Dann kann ich auch händisch runden.
Nein. Das von out klappt mit allen positiven Zahlen und ist verflixt pfiffig.
Erst +0.5 rechnen und dann abrunden.
-
Freddy_Kay schrieb:
out schrieb:
Meinst du etwa
double d = 1.23; int gerundet = d+0.5;Wo liegts Problem?

dafür muss ich vorher die größe der double selbst prüfen. Dann kann ich auch händisch runden.
Wie meinst du das prüfen? Verstehe ich nicht, was muss da geprüft werden? Volkard wollte dich auf den Arm nehmen, runden ist runden

-
Freddy_Kay schrieb:
Wenn sich das kaufmänisch runden nennt, dann bitte ich meine Wortwahl zu entschuldigen
Solltest eigentlich nur den Hinweis nehmen und mit dem neuen Wort googeln.
-
out schrieb:
Volkard wollte dich auf den Arm nehmen, runden ist runden

Du Wicht.
http://de.wikipedia.org/wiki/Rundung
-
Nexus schrieb:
Das hilft doch schonmal. Dabei bleiben Probleme wegen der ungebauigkeit von double werten erhalten? der Rückgabewert ist ja dann eine Gleitkommazahl, die unter Umständen nach einem cast zu einer Integer Zahl dann praktisch abgerundet wird? Im Klartext:
round(863.6) = 863.999999999999999871
static_cast<int>(863.999999999999999871) = 863
Oder kann man das umgehen?
EDIT:://
volkard schrieb:
out schrieb:
Volkard wollte dich auf den Arm nehmen, runden ist runden

Du Wicht.
http://de.wikipedia.org/wiki/Rundungdamn... ich dachte genau das würde "mathematisches" runden sein^^ wieder was gelernt
-
Freddy_Kay schrieb:
Nexus schrieb:
Das hilft doch schonmal. Dabei bleiben Probleme wegen der ungebauigkeit von double werten erhalten? der Rückgabewert ist ja dann eine Gleitkommazahl, die unter Umständen nach einem cast zu einer Integer Zahl dann praktisch abgerundet wird? Im Klartext:
round(863.6) = 863.999999999999999871
static_cast<int>(863.999999999999999871) = 863
Oder kann man das umgehen?
Kein Problem.
double kann Ganzzahlen (wenn sie nicht gerade in die Mehrmilliarden gehen) glatt darstellen und da gibt es keine Fehler mehr beim Konvertieren nach int.
Also
round(863.6) = 864.0
-
Alles klar!
Danke hierfür!
-
...
-
out schrieb:
Meinst du etwa
double d = 1.23; int gerundet = d+0.5;Wo liegts Problem?

Zahlen < -0.5 ?
-
volkard schrieb:
double kann Ganzzahlen (wenn sie nicht gerade in die Mehrmilliarden gehen) glatt darstellen und da gibt es keine Fehler mehr beim Konvertieren nach int.
Ergänzung: Falls double eine zu große Ganzzahl nicht darstellen kann, dann ist der Ersatz dafür eine andere Ganzzahl in der Nähe.
Also angenommen, 123456789 könnte nicht exakt dargestellt werden (kann es, ist nur ein Beispiel), dann würde es vielleicht als 123456788, aber niemals als 123456789.001 dargestellt werden.
-
In der Größenordnung, wo der double Ganzzahlen nicht mehr genau darstellen kann, sind Nachkommastellen ohnehin schon lange Geschichte.
-
Kommt drauf an, was man mit "schon lange" meint. Es liegen dazwischen nur 2 binäre Größenordnungen, also ein Faktor von 4.
-
SeppJ schrieb:
In der Größenordnung, wo der double Ganzzahlen nicht mehr genau darstellen kann, sind Nachkommastellen ohnehin schon lange Geschichte.
Schon klar, alter Physiker.
Aber ich gebe zu bedenken, daß es seit heute oberhalb von 2^^53 keine Primzahlen mehr gibt.
scnr