Réglage de la précision d'un double sans l'aide de flux (ios_base::précision)
Est-il un moyen de le faire sans utiliser le flux de données? Par exemple, quelque chose comme ceci:
double a = 6.352356663353535;
double b = a.precision(5);
au lieu de:
double a = 6.352356663353535;
std::cout.precision(5);
std::cout << a << std::endl;
Je suis novice en C++ et je suis curieux. Merci d'avance.
- Pour clarifier, je suppose qu'une fois le premier exemple
std::cout << b << std::endl;
devrait produire le même résultat que le deuxième exemple n'? - Non, pour le premier exemple, double b était là pour réduire à 5 sig. fig, alors que dans le deuxième exemple, il n'est pas nécessaire pour cette variable.
- C'est pourquoi je me suis renseigné sur le sortie. Vous êtes confus au sujet de la représentation interne, de toute évidence, donc, je me demandais ce que vous vous attendiez à voir à l'extérieur.
- Oui, je voulais obtenir un nombre à 5.s.f. Je suis maintenant, vous demandez-vous s'il est possible d'obtenir une chaîne de caractères dans le flux, et si oui, comment le faire avec le deuxième exemple.
Vous devez vous connecter pour publier un commentaire.
double
s sont presque universellement mis en œuvre comme Les nombres à virgule flottante IEEE. Leur précision dépend de la taille des numéros seulement (dans le cas dedouble
, qui est l'abréviation de “double-nombre à virgule flottante”, c'est 53 bits). Il n'existe aucun moyen de réglage manuel de la précision d'un nombre à virgule flottante.La la précision de l'affichage est toujours une propriété de la sortie de mise en forme, jamais de le nombre. N'essayez pas de modifier le numéro via l'arrondissement, l'opération n'a pas de sens. Vous n'avez pas besoin à réduire un certain nombre de précision, sauf à des fins d'affichage.
J'ai révisé le code en tenant compte @john, @Konrad et @KennyTM suggestions. J'ai vérifier qu'il fonctionne avec des nombres négatifs.
Sorties
floor
pas une fonte à long terme qui pourrait déborder.double b = floor(a*10000.0)/10000.0;
(et probablement utiliserceil
pour cinq numéros).std::modf
, etcetera.roundf
?<math.h>
t fournir les surcharges en C++ (D. 5).std::round
(désolé, mais il s'adapte à la discussion en cours)? Et à côté de çaroundf
est pourfloat
, de toute façon. Othwerwise vous avez raison, en C++11 il n'y a pas besoin de manuel, tour de de même plusUn
double
a toujours la même précision interne (probablement 53 bits binaire de précision), peu importe ce que vous faites. C'est seulement lors de l'écriture du double que le texte sous la forme décimale où vous pouvez contrôler la précision décimale de la sortie. Donc, non, vous ne pouvez pas définir la précision d'un binaire double précision nombre à rien d'autre qu'il est natif de précision (laisser de côté une précision décimale).Si vous souhaitez arrondir un nombre à un nombre donné de chiffres après la virgule, puis consulter Phillip's réponse (mais avec les amendements que jean et Konrad fait, dans leurs commentaires, bien sûr). Mais notez que cela ne change pas le preicision du type sous-jacent et tous les calculs avec ce numéro seront effectués en binaire double précision. Aussi un tel arrondie nombre décimal n'a pas besoin d'être représenté exactement dans le sous-jacent type à virgule flottante binaire.
Si vous voulez vraiment effectuer exacte de l'arithmétique décimale, alors vous devez regarder pour les bibliothèques de tiers le fait de donner des décimaux à virgule flottante types.