2017-06-24 4 views
0

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.

+5

Erforderliche Lektüre: [Was jeder Informatiker über Gleitkommaarithmetik wissen sollte] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

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

+0

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

Antwort

3

Konvertieren den 53-Bit (führenden 1 angedeutet) Mantisse des Doppels auf binären Festpunkt:

0.00011001100110011001100110011001100110011001100110011010 

Dies entspricht den Dezimalwert

0.1000000000000000055511151231257827021181583404541015625 

, die das Ergebnis der Frage entspricht zu 30 Ziffern

0.100000000000000005551115123126 

Aber was ein 54. Bit sein könnte, ist unbekannt, und wenn Sie dies als ein Rang betrachten e der möglichen Werte, die binären Festkommazahlen nur würde unter und über

0.000110011001100110011001100110011001100110011001100110001 
0.000110011001100110011001100110011001100110011001100110101 

repräsentiere Dezimalwerte werden:

0.099999999999999984734433411404097569175064563751220703125 
0.100000000000000012490009027033011079765856266021728515625 

, die 16 oder 17 Stellen Genauigkeit impliziert. Die 30 Genauigkeitsziffern sind also nur dann korrekt, wenn Sie die Zahl mit doppelter Genauigkeit als exakte Repräsentation und nicht als nächste Repräsentation betrachten.

Verwandte Themen