Comment puis-je imprimer un double de la valeur avec une précision à l'aide de cout?
Donc j'ai obtenu la réponse à ma dernière question (je ne sais pas pourquoi je n'avais pas pensé à ça). J'ai l'impression d'un double
à l'aide de cout
qui s'est arrondi quand je ne l'attendais pas. Comment puis-je faire cout
imprimer un double
à l'aide de précision?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez régler la précision directement sur
std::cout
et l'utilisation de lastd::fixed
spécificateur de format.Vous pouvez
#include <limits>
pour obtenir le maximum de précision d'un float ou double.fixed
? Avecdouble h = 6.62606957e-34;
,fixed
me donne0.000000000000000
etscientific
sorties6.626069570000000e-34
.cout.precision(numeric_limits<double>::digits10 + 2);
je ne reçois 16....max_digits10
pour désigner la même. Fixe la réponse pour en tenir compte.max_digits10
pourrait être utile pour le réglage du nombre de chiffres affichés en notation scientifique; fixe, elle ne fonctionne que pour des valeurs de magnitude proche de 1.float
.long double
sur x87 (avec plus de précision, par exemple, dans CCG), nous avons 18 vs 21 chiffres, bien qu'avecfloat128
(IEEE754binary128
): 33 vs 36 chiffres. C'est donc ledouble
qui est aberrant avec ses 15 vs 17 chiffres min et max.Utilisation
std::setprecision
:std::setprecision (17)
pour le double, voir les commentaires sur @Bill Le Lézard de réponse.Voici ce que je voudrais utiliser:
Fondamentalement les limites paquet a des traits de caractère pour tous les construire dans les types de.
L'un des traits pour les nombres à virgule flottante (float, double, long double) est le digits10 attribut. Cela définit la précision (j'ai oublié la terminologie exacte) d'un nombre à virgule en base 10.
Voir: http://www.cplusplus.com/reference/std/limits/numeric_limits.html
Pour plus de détails sur d'autres attributs.
std::setprecision()
:#include <iomanip>
std::numeric_limits<double>
au lieu denumberic_limits<double>
1
àstd::numeric_limits<double>::digits10
?max_digits10
à la place. Voir this.std::setprecision (std::numeric_limits<double>::digits10 + 2)
, voir les commentaires sur @Bill Le Lézard de réponse.max_digits10
, pas arbitrairedigits10+2
. Sinon, dans le cas defloat
,long double
,boost::multiprecision::float128
ce sera un échec, car il vous faudrait+3
au lieu de+2
.La iostreams façon est une sorte de maladroit. Je préfère utiliser
boost::lexical_cast
parce qu'il calcule le droit de précision pour moi. Et c'est rapide, trop.De sortie:
Voici comment afficher un double avec une précision complète:
Cette affiche:
max_digits10 est le nombre de chiffres qui sont nécessaires pour représenter de façon unique toutes différentes valeurs doubles. max_digits10 représente le nombre de chiffres avant et après la virgule.
Ne pas utiliser set_precision(max_digits10) avec std::fixe.
Sur fixe notation, set_precision() définit le nombre de chiffres seulement après le point décimal. C'est incorrect car max_digits10 représente le nombre de chiffres avant et après le point décimal.
Cette affiche un résultat incorrect:
Remarque: les fichiers d'en-Tête requis
100.0000000000005
n'est pas exactement comme dans undouble
. (Il peut sembler comme il se doit, mais il ne le fait pas, car il est normalisé, c'est à dire sa représentation binaire). Pour voir cela, essayez:100.0000000000005 - 100
. Nous obtenons4.973799150320701e-13
.Par plus de précision, je suppose que signifie suffisamment de précision pour montrer la meilleure approximation de la valeur de référence, mais il convient de rappeler que
double
est stocké à l'aide de représentation en base 2 et en base 2 ne peut pas représenter quelque chose d'aussi trivial que1.1
exactement. La seule façon d'obtenir la plein plein précision de la double réel (SANS arrondi ERREUR) est à imprimer les bits binaires (ou hex nybbles). Une façon de le faire est d'écrire ledouble
à ununion
et l'impression de la valeur de l'entier de bits.Cela vous donnera 100% de précision de précision de la double... et être totalement illisible parce que les humains ne peuvent pas lire IEEE double format ! Wikipédia a une bonne écriture sur la façon d'interpréter les bits binaires.
Dans les nouvelles versions de C++, vous pouvez le faire
Utilisation
hexfloat
ouutilisation
scientific
et de définir la précisionTrop de réponses traiter un seul de 1) base 2) fixe/disposition scientifique ou 3) de précision. Trop de réponses avec précision ne pas fournir la bonne valeur. D'où cette réponse à une vieille question.
Un
double
est certainement codée en utilisant la base 2. Une approche directe avec le C++11 est à imprimer à l'aide destd::hexfloat
.Si une non-sortie décimale est acceptable, nous sommes fait.
fixed
ouscientific
?Un
double
est un virgule flottante type, pas point fixe.Ne pas utilisation
std::fixed
que qui ne parvient pas à imprimer de petitsdouble
que quelque chose, mais0.000...000
. Pour les grandesdouble
, il imprime de nombreux chiffres, peut-être des centaines interroge sur le caractère informatif.Pour l'impression avec plus de précision, utilisez d'abord
std::scientific
qui va "écrire des valeurs à virgule flottante en notation scientifique". Avis de la valeur par défaut de 6 chiffres après la virgule, un montant insuffisant, est traitée dans le point suivant.Un
double
codé binaire de la base de 2 code pour la même précision entre les diverses puissances de 2. C'est souvent 53 bits.[1.0 2.0...) il y a 253 différentes
double
,[2.0 4.0...) il y a 253 différentes
double
,[8.0 4.0...) il y a 253 différentes
double
,[8.0...10.0) il y a 2/8 * 253 différentes
double
.Encore si le code imprime en décimal avec
N
chiffres significatifs, le nombre de combinaisons [1.0...10.0) est de 9/10 * 10N.Quelle que soit
N
(de précision) est choisi, il ne sera pas un one-to-one mapping entredouble
de décimales et de texte. Si un fixeN
est choisi, il sera parfois un peu plus ou moins de vraiment nécessaire que pour certainesdouble
valeurs. Nous pourrions d'erreur sur trop peu (a)
ci-dessous) ou trop (b)
ci-dessous).3 candidats
N
:a) Utiliser une
N
donc, lors de la conversion de texte-double
texte, nous arrivons dans le même texte pour tous lesdouble
.b) Utiliser un
N
donc, lors de la conversion dedouble
-texte-double
nous arrivons à la mêmedouble
pour tousdouble
.Quand
max_digits10
n'est pas disponible, il faut noter qu'en raison de la base 2 et en base 10 attributs,digits10 + 2 <= max_digits10 <= digits10 + 3
, nous pouvons utiliserdigits10 + 3
pour assurer assez de chiffres décimaux sont imprimés.c) Utiliser un
N
qui varie en fonction de la valeur.Cela peut être utile lorsque le code veut afficher un texte minimal (
N == 1
) ou le exacte valeur d'undouble
(N == 1000-ish
dans le cas dedenorm_min
). Pourtant, depuis c'est le "travail" et n'est pas susceptible OP objectif, il sera mis de côté.Il est généralement b) qui est utilisé pour l'impression d'un
double
valeur avec plus de précision". Certaines applications peuvent préférer un) à l'erreur de ne pas fournir trop d'informations.Avec
.scientific
,.precision()
définit le nombre de chiffres à imprimer après la virgule, ce qui1 + .precision()
chiffres sont imprimés. Le Code doitmax_digits10
total des chiffres de telle sorte.precision()
est appelée avec unmax_digits10 - 1
.Similaire C question
%.12f moyens à virgule flottante, avec une précision de 12 chiffres.
cout est un objet qui a un tas de méthodes que vous pouvez appeler pour modifier la précision et de la mise en forme de l'imprimé choses.
Il y a un setprecision(...) de l'opération, mais vous pouvez également définir d'autres choses comme la largeur d'impression, etc.
Rechercher cout dans votre IDE de référence.
La plupart de façon portable...
Avec ostream::précision(int)
donnera
Pourquoi vous devez dire "+1", je n'ai aucune idée, mais le chiffre supplémentaire pour vous est correct.