std::cout avec un nombre flottant
Je suis à l'aide de visual studio 2015 à imprimer deux nombres flottants:
double d1 = 1.5;
double d2 = 123456.789;
std::cout << "value1: " << d1 << std::endl;
std::cout << "value2: " << d2 << std::endl;
std::cout << "maximum number of significant decimal digits (value1): " << -std::log10(std::nextafter(d1, std::numeric_limits<double>::max()) - d1) << std::endl;
std::cout << "maximum number of significant decimal digits (value2): " << -std::log10(std::nextafter(d2, std::numeric_limits<double>::max()) - d2) << std::endl;
L'impression est la suivante:
value1: 1.5
value2: 123457
maximum number of significant decimal digits (value1): 15.6536
maximum number of significant decimal digits (value2): 10.8371
Pourquoi 123457 est imprimer pour la valeur 123456.789? Ne ANSI C++ spécification permettent d'afficher quoi que ce soit pour les nombres flottants lorsque std::cout est utilisé sans std::setprecision()?
"Ne ANSI C++ spécification permettent d'afficher quoi que ce soit pour les nombres flottants lorsque std::cout est utilisé sans std::setprecision()?" la réponse est oui.
juste, je veux dire std::cout.
pourquoi le cahier des charges est très vague sur ce sujet? Il serait utile que les développeurs si la spécification est plus spécifique (comme l'impression que le nombre flottant avec ses chiffres significatifs). Quelque chose comme printf("%.16 g\n", d).
La précision par défaut est de 6, tout comme pour printf.
droit std::cout.précision() donne 6. La spécification est bien définie. Merci.
juste, je veux dire std::cout.
pourquoi le cahier des charges est très vague sur ce sujet? Il serait utile que les développeurs si la spécification est plus spécifique (comme l'impression que le nombre flottant avec ses chiffres significatifs). Quelque chose comme printf("%.16 g\n", d).
La précision par défaut est de 6, tout comme pour printf.
droit std::cout.précision() donne 6. La spécification est bien définie. Merci.
OriginalL'auteur Daniel Laügt | 2015-11-22
Vous devez vous connecter pour publier un commentaire.
L'arrondi se produit en raison de la norme C++ qui peut être vu par la rédaction
std::cout<<std::cout.precision();
La sortie à l'écran 6, qui indique que la valeur par défaut du nombre de chiffres significatifs qui sera imprimé par le cout de déclaration est de 6. C'est pourquoi il arrondit automatiquement le nombre flottant à 6 chiffres.
OriginalL'auteur incomplet_
Je pense que le problème ici est que la norme C++ n'est pas écrit pour être facile à lire, il est écrit pour être précis et de ne pas se répéter. Donc, si vous regardez en haut de la
operator<<(double)
, il ne dit rien d'autre que "il utilisenum_put
- parce que c'est la façon dont lecout << some_float_value
est mis en œuvre.Le comportement par défaut est ce que
print("%g", value);
n' [tableau 88 dans n3337 version de la norme C++ explique ce qu'est l'équivalence de printf et c++ formatage]. Donc, si vous voulez faire%.16g
vous avez besoin de changer la précision en appelantsetprecision(16)
.OriginalL'auteur Mats Petersson
Ce que vous avez souligné, c'est en fait l'une des nombreuses choses que le comité de normalisation à prendre en compte concernant la
standard iostream
en C++. De telles choses fonctionnent bien, quand vous écrivez :-Mais pas avec
std::cout
où vous devez utiliser lastd::setprecision
parce que c'est le formatage est similaire à l'utilisation de%g
au lieu de%f
dansprintf
. Si vous avez besoin d'écrire :-Mais si vous n'aimez pas cette méthode & sont à l'aide de C++11 (& à partir), alors vous pouvez aussi écrire à :-
Cela vous donnera le même résultat que
printf ("%f\n", d2);
.Une bien meilleure méthode est d'annuler l'arrondissement qui se produit dans
std::cout
en utilisantstd::fixed
:-De sortie :-
Donc je suppose que ton problème est résolu !!
OriginalL'auteur Ankit Acharya