stringstream >> float -> "2.1" wird zu 2.0999999 ????
-
So hart es klingen mag: Benutze keinen Fließkommatyp (weder float noch double). Manche Sprachen haben einen Decimal-Typ, das wär hier das richtige, guck mal ob du eine Library findest. Sonst selber bauen.
-
Tolle Wurst.
Erstaunlich, dass ich noch nie darüber etwas gelesen habe.Danke
-
Es gibt eine Boost Bibliothek für rationale Zahlen, die wäre denke ich angebracht. Du musst allerdings den operator>> wohl selber noch so überladen, dass er Kommazahlen akzeptiert, da er sonst nur mit z.B. 21/10 arbeiten würde.
-
Es ist extrem wichtig, dass genau die Werte rauskommen, die auch eingegeben wurden.
Warum?
-
Als Beispiel für das Warum:
Stell Dir eine Buchhaltungssoftware vor, die mehrfach Werte wie 2.1 verarbeitet und den Debitor irgendwann exakt auf 0 haben muss.
Der Debitor darf nach Ausgleich aller Posten kein Guthaben und keine Schulden haben.
Und so gibt es in dieser Art sicherlich noch mehr Anwendungen die eine solche Genauigkeit benötigen.
-
Knuddlbaer schrieb:
Als Beispiel für das Warum:
Stell Dir eine Buchhaltungssoftware vor, die mehrfach Werte wie 2.1 verarbeitet und den Debitor irgendwann exakt auf 0 haben muss.
Der Debitor darf nach Ausgleich aller Posten kein Guthaben und keine Schulden haben.
Und so gibt es in dieser Art sicherlich noch mehr Anwendungen die eine solche Genauigkeit benötigen.
hier sind gleitkommazahlen allerdings von vornherein die falsche wahl. wie der name sagt, ist das komma gleitend, d.h. die anzahl der stellen hinter dem komma hängt direkt mit der größe des wertes zusammen (und zwar auch für dezimal-typen, die dezimalzahlen exakt darstellen können). für den genannten falle ist das aber gerade nicht richtig. In einer Buchhaltungssoftware brauchen wir eine bestimmte Genauigkeit (etwa cent-genau, 1/100-cent-genau) völlig unabhängig von der größe des wertes. die lösung ist hier nat. einfach: benutze integer und stelle von vornherein auf cent oder 1/100-cent usw. ab.
-
camper schrieb:
...auch für dezimal-typen, die dezimalzahlen exakt darstellen können ...

Meinst Du das vielleicht genau andersherum ?
"Dezimalzahlen, die Dezimaltypen exakt darstellen können", klingt in meinen Ohren jedenfalls sinnvoller.Gruß,
Simon2.
-
Simon2 schrieb:
camper schrieb:
...auch für dezimal-typen, die dezimalzahlen exakt darstellen können ...
Meinst Du das vielleicht genau andersherum ?
"Dezimalzahlen, die Dezimaltypen exakt darstellen können", klingt in meinen Ohren jedenfalls sinnvoller.ist schon richtig so - typen werden verwendet um zahlen darzustellen, ned andersrum
*edit : *
beispiel:
mit dem typ int kann ich jede integer zahl in wertebereich von int darstellen,mit der zahl 3 hingegen irgendwelche typen darzustellen ist ned praktisch, und nur schwer abbildbar
-
r0nny schrieb:
...
ist schon richtig so - typen werden verwendet um zahlen darzustellen, ned andersrum...Du "nutzt" hier eine Mehrdeutigkeit in der Deutschen Sprache, wo Nominativ und Akkusativ verwechselbar sind.

"Marko bringt Karin nachhause."
Wer ist hinterher zuhause ?
Auf welche Frage ist das die Antwort ?
("Wer bringt Karin nachhause ?" - "Wen bringt Karin nachhause ?")
Ich niemals behauptet, dass Typen durch Zahlen darzustellen seien, sondern, dass die Aussage, die camper zu "Fließkommazahlen" getroffen hat ("... Zahlen werden mit Fließkomma dargestellt.."), nicht auf Dezimaltypen, sondern auf (in Fließkommatypen abgebildete) Dezimalzahlen übertragbar ist.
Gruß,
Simon2.
-
Recht hast du. Allerdings ist es üblich davon auszugehen, dass das erste Nomen eines Hauptsatzes das Subjekt ist.
-
.filmor schrieb:
Recht hast du. Allerdings ist es üblich davon auszugehen, dass das erste Nomen eines Hauptsatzes das Subjekt ist.
Gleichzeitig ist es aber auch üblich, besonders betonte Satzteile (wenn grammatisch möglich) nach vorne im Satz zu ziehen.

Nichtsdestotrotz bleibt meine Frage (an camper) noch unbeantwortet, ob ich ihn richtig verstanden habe, oder er das doch ganz anders meint.
Verstanden habe ich: "Selbst die Zahl 2 läuft (in einem float dargestellt), Gefahr, von Rundungsfehlern betroffen zu werden; in einem int dagegen kann das nicht passieren."Gruß,
Simon2.
-
Simon2 schrieb:
Selbst die Zahl 2 läuft (in einem float dargestellt), Gefahr, von Rundungsfehlern betroffen zu werden;
Ein unschönes Beispiel, da 2 (normalerweise) die Basis von floats ist und deshalb exakt dargestellt werden kann. Für 3 gilt der Satz aber afaik.
Simon2 schrieb:
in einem int dagegen kann das nicht passieren.
Das stimmt, denn bei Integern hast du eine bijektive(?) Zuordnung.
-
Wenn du mit rationalen Zahlen arbeitest (als Zahlen die als Bruch darstellbar sind) dann gibt es Bibliotheken die die ohne Genauigkeitsverlust brechnen können. (Beispiel: GMP, http://www.dhost.info/voodoocpp/index.php?page=progs/libs).