2011-08-25 2 views
6

C++: Quelle est la spécification de format printf() pour float? (Visual C++)C++: Quelle est la spécification du format printf() pour "float"?

J'avais l'habitude d'être que j'ai utilisé %g pour float et %lg pour double.

Il semble que la spécification a changé et float est indéfini et double est %g.

J'ai des bits en mémoire que j'imprime donc le casting n'est pas une option.

Y at-il un moyen que je peux imprimer float valeurs en utilisant printf()?

Mise à jour:

Ce code a été écrit pour les tests unitaires C++ libs génériques utilisés sur un système embarqué. Voici ce que je devais faire pour que le float fonctionne. Le code est en fonction du modèle:

template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned> 
Error testMatrixT() 
{ ... 

est ici un petit bout de code:

if (typeid(Ttyp) == typeid(float)) {  
    float64 c = *(float32*)&Tp(row,col); 
    float64 a1 = *(float32*)&Arg1(row,col); 
    float64 a2 = *(float32*)&Arg2(row,col); 
    float64 e = *(float32*)&Exp(row,col); 
    m_b = (c == e); 
    _snprintf(m_acDiag, sizeof(m_acDiag)-1 
     , "add(Arg1,Arg2): arg1=%g, arg2=%g, Expected=%g, Actual=%g, Result: %s" 
     , a1, a2, e, c, BOOL_PF(m_b)); 
} else { 
    ... 

assez laid est pas? L'utilisation de flottants comme arguments donne une mauvaise sortie. Peut-être en raison de l'utilisation de _snprintf()? Il ya des années j'utiliserais %lg et ce serait OK. Plus maintenant.

+1

C'est la troisième ou quatrième question que j'ai vu, en autant de jours, à propos de l'impression d'un flotteur! – Praetorian

+0

Vous n'avez pas mentionné ce qui se passe si vous utilisez% g. Mais% g n'est pas la valeur par défaut pour float de toute façon. – steve

+1

@steve: '% g' fonctionne pour float, puisqu'il est promu en double. –

Répondre

16

double et flotteur utiliser spécificateurs le même format avec printf (%a , %e, %f et %g). C'est parce que printf est une fonction variadique. Tous les arguments flottants sont implicitement promus pour doubler avant l'appel; vous ne pouvez pas passer un flotteur à printf.

1
printf("float: %f", floatValue); 

ou si vous voulez la notation exponentielle:

printf("float: %e", floatValue); 
+0

Ou si vous voulez un point fixe ou exponentiel: 'printf (" float:% g ", floatValue);' –

4

A la question dans le titre: Il n'y a pas/"% f"

A la question dans le corps du message: Oui et non.

printf est une fonction variadique. Tous les arguments float sont automatiquement promus à double s. Vous imprimez un flottant en le passant à printf, mais aucun float n'atteint la fonction printf.

1

D'autres ont souligné le format d'impression float en utilisant printf, mais, puisque vous utilisez C++, ma suggestion est d'éviter cela complètement. Utilisez les flux C++ à la place, vous n'avez donc pas à vous soucier des spécificateurs de format. Il est également de type sécurisé, tandis que printf ne l'est pas.

#include <iostream> 

int main() 
{ 
    float f = 1.234; 
    std::cout << f << std::endl; 
} 

Si vous avez un tableau d'octets contenant un flotteur, memcpy dans une variable de flotteur et utilisez le code ci-dessus.

+0

J'ai fini par utiliser des flux, mais je pense que c'est une solution temporaire car je suis sûr que nous allons finalement sur une plate-forme intégrée sans support STL. Il me semble que les flottants sont obsolètes car il n'y a pas de spécification de format pour cela et cela ne fonctionne pas comme argument pour printf à moins que je ne le convertisse en double. –

1

%g a toujours été le format correct pour float ou double (puisque les arguments flottants sont promus à doubler pour les fonctions variées comme printf).

%lg%lg a été ajouté comme synonyme de %g (en C99, je ne sais pas quand ou si C++ l'a adopté), probablement pour une meilleure symétrie avec la famille *scanf.

$Lg est pour double long.

Vous pouvez remplacer g par f ou e dans ce qui précède, en fonction du format de sortie souhaité.

+0

Sur de nombreux systèmes, C++ utilise le même environnement d'exécution que C, donc si la bibliothèque C utilise la norme C99, C++ le fait également. – user877329

+0

@ user877329: True - mais il existe toujours des bibliothèques C qui ne supportent pas C99 (Microsoft, par exemple, si je ne me trompe pas). –

Questions connexes