2017-06-24 2 views
0

Je comprends que numeric_limits :: max_digits10 donne le nombre maximum de chiffres après le point décimal qui sont disponibles. Mais si je SetPrecision() à une valeur qui est supérieure à cela, il me donne encore des chiffres non nuls au-delà de cette valeur max:imprimer 30 chiffres d'une valeur double en C++

assert(std::numeric_limits<double>::max_digits10 == 17); 
std::cout << std::setprecision(30) << double(.1) << '\n'; 

Cette imprime:

0.100000000000000005551115123126 

les chiffres sont-au-delà de 17 pas être fiable pour être précis?

Merci.

+5

Lectures obligatoires: [Ce que tout chercheur en informatique doit savoir sur l'arithmétique en virgule flottante] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

Le double est défini comme 1,7 E +/- 308 (15 chiffres) Vous pouvez donc aller jusqu'à 308 chiffres pour certains nombres. Mais lisez ce que @ThomasMatthews a suggéré en premier. –

+0

La précision de 'double' n'est pas fixée comme ± 10^(- 17), elle dépend de la valeur du nombre. Les plus grandes valeurs ont une moins bonne précision, des nombres plus petits - mieux. En d'autres termes, ± erreur de valeur est déterminée par rapport à la valeur. Comme vous pouvez le voir, l'erreur pour le nombre x est d'environ ± 0.0000000000000000 * x – Pavel

Répondre

3

Conversion 53 bits (leader 1 implicite) mantisse du double à point fixe binaire:

0.00011001100110011001100110011001100110011001100110011010 

Cela correspond à la valeur décimale

0.1000000000000000055511151231257827021181583404541015625 

qui correspond au résultat de la question à 30 chiffres

0.100000000000000005551115123126 

Cependant, ce qui pourrait être un 54e bit est inconnu, et si vous considérez cela comme un rang e des valeurs possibles, les nombres à virgule fixe binaires juste au-dessous et ci-dessus serait

0.000110011001100110011001100110011001100110011001100110001 
0.000110011001100110011001100110011001100110011001100110101 

représentant des valeurs décimales:

0.099999999999999984734433411404097569175064563751220703125 
0.100000000000000012490009027033011079765856266021728515625 

qui implique 16 ou 17 chiffres de précision. Les 30 chiffres de précision ne sont donc précis que si vous considérez le nombre double précision comme une représentation exacte plutôt que comme la représentation la plus proche.