float/double <-> string verlustbehaftet?
-
Hi
Bekomme ich eine leicht andere Zahl wenn ich in beide Richtungen umwandle?
danke
-
Möglich. Hängt auch davon ab, wie genau du den umwandelnden Stream einstellst.
-
Nexus schrieb:
Möglich. Hängt auch davon ab, wie genau du den umwandelnden Stream einstellst.

ich nehm istringstream und hab keine Ahnung was da einzustellen wäre...
-
Zum Beispiel
precision(). Schau mal hier: http://www.cplusplus.com/reference/iostream/stringstream/
-
Ja - rein von der Mathematik her, ist es nicht möglich aus jeder endlichen Dezimalzahl eine Zahl mit einer endlichen Binärdarstellung zu machen. Umgekehrt geht es schon. Wenn Du also als Quelle einen String hast: z.B.: "0.1" so bekommst Du nur eine Näherung, wenn man daraus einen float/double machst. Rückwärts geht es dann zwar genau, aber das Ergebnis ist nicht mehr "0.1" sondern so irgendwas mit "0.0999..9995".
Das kann man auch nicht mit long double oder 'ganz long double' beheben. Es ist system-gegeben.
In der Praxis macht man es so, dass man bei der Ausgabe eines double/float-Typs die Anzahl Dezimalstellen nach der Genauigkeit des jeweiligen Datentyp wählt (z.B.:
std::numeric_limits< double >::digits10 + 1) und diese Zahl wieder einliest, das wird in jedem Fall korrekt gerundet und man sollte die selbe Zahl wieder erhalten.
Gruß
Werner
-
Sehr aufschlussreich. Danke.
-
ich kapier den Unterschied zwischen digits10 und digits nicht

-
blubberfisch schrieb:
ich kapier den Unterschied zwischen digits10 und digits nicht

aus dem Standard - Kapitel 18.2.1 Numeric Limits:
static const int digits; 6 Number of radix digits that can be represented without change. 7 For built-in integer types, the number of non-sign bits in the representation. 8 For floating point types, the number of radix digits in the mantissa.183) static const int digits10; 9 Number of base 10 digits that can be represented without change.184) 10 Meaningful for all specializations in which is_bounded != false. Fußnoten: 183) Equivalent to FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG. 184) Equivalent to FLT_DIG, DBL_DIG, LDBL_DIG.digits ist die Anzahl der Zeichen in Binärdarstellung, digits10 die in Dezimaldarstellung.
Gruß
Werner