Mein Verständnis ist, dass numeric_limits :: max_digits10 gibt die maximale Anzahl der Ziffern nach dem Komma, die verfügbar sind. Aber wenn ich() auf einen Wert SetPrecision, der größer als das ist, es gibt mir noch Ziffern ungleich Null jenseits dieser Maximalwert:Drucken 30 Ziffern eines Doppelwerts in C++
assert(std::numeric_limits<double>::max_digits10 == 17);
std::cout << std::setprecision(30) << double(.1) << '\n';
Dies gibt:
0.100000000000000005551115123126
Sind die Ziffern über 17 nicht zu vertrauen, um genau zu sein?
Danke.
Erforderliche Lektüre: [Was jeder Informatiker über Gleitkommaarithmetik wissen sollte] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –
Double ist definiert als 1.7 E +/- 308 (15 Ziffern) Sie können also für einige Ziffern bis zu 308 Ziffern eingeben. Aber lies was @ThomasMatthews zuerst vorgeschlagen hat. –
Genauigkeit von 'double' ist nicht wie ± 10^(- 17) festgelegt, es hängt vom Wert der Zahl ab. Größere Werte haben schlechtere Genauigkeit, kleinere Zahlen - besser. Mit anderen Worten, ein ± Wertfehler wird relativ zu dem Wert bestimmt. Wie Sie sehen können, ist der Fehler für die Zahl x etwa ± 0.0000000000000000005 * x – Pavel