affiche 30 chiffres d’une valeur double en c ++

D’après ce que j’ai compris, numeric_limits :: max_digits10 donne le nombre maximal de chiffres disponibles après le point décimal. Mais si je donne à précision () une valeur supérieure à celle-ci, cela me donne toujours des chiffres non nuls au-delà de cette valeur maximale:

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

Cela imprime:

 0.100000000000000005551115123126 

Les chiffres au-delà de 17 ne doivent-ils pas être fiables pour être précis?

Conversion de la mantisse à 53 bits (1 premier implicite) du double en point fixe binary:

 0.00011001100110011001100110011001100110011001100110011010 

Ceci est égal à la valeur décimale

 0.1000000000000000055511151231257827021181583404541015625 

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

 0.100000000000000005551115123126 

Cependant, ce qui pourrait être un 54ème bit est inconnu, et si vous considérez cela comme une plage de valeurs possibles, les nombres de points fixes binarys juste en-dessous et au-dessus seraient

 0.000110011001100110011001100110011001100110011001100110001 0.000110011001100110011001100110011001100110011001100110101 

représentant des valeurs décimales:

 0.099999999999999984734433411404097569175064563751220703125 0.100000000000000012490009027033011079765856266021728515625 

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