Printf spécificateur de largeur pour maintenir la précision de la valeur à virgule flottante

Est-il un printf spécificateur de largeur qui peut être appliquée à un virgule flottante spécificateur qui serait automatiquement le format de sortie pour le nombre nécessaire de chiffres significatifs tels que lors de la numérisation de la chaîne de retour dans, l'original de la valeur à virgule flottante est acquis?

Par exemple, supposons que j'ai l'impression d'un float à une précision de 2 décimales:

float foobar = 0.9375;
printf("%.2f", foobar);    //prints out 0.94

Quand je scan la sortie 0.94, je n'ai pas conformes aux normes garantie que je vais obtenir l'original 0.9375 à virgule flottante valeur de retour (dans cet exemple, je ne sera probablement pas).

Je voudrais une façon de dire printf pour imprimer automatiquement la valeur à virgule flottante pour le nombre nécessaire de chiffres significatifs pour s'assurer qu'il peut être analysé en arrière à l'original de la valeur passée à printf.

Je pourrais utiliser des macros dans float.h à tirer le maximum de largeur de passer à printf, mais il y a déjà un rédacteur de devis pour imprimer automatiquement le nombre nécessaire de chiffres significatifs -- ou au moins à la largeur maximale?

  • Il me semble que 6 est déjà le plus de précision possible la float type d'offre. (Valeurs décimales après la 6ème sera probablement de plus en plus loin off). Regardez en haut de la réelle #defined valeur de FLT_DIG sur votre plate-forme, tous les paris dire, il va juste être 6.
  • Si vous êtes juste de recommander que l'on utilise une hypothèse de l'air au lieu de prendre le portable d'approche?
  • Non, je ne recommanderais pas à l'aide de "l'hypothèse de l'air", je conseille printf( "%f", val ); qui est déjà un portable, efficace, et la valeur par défaut.
  • De sorte que je puisse l'ajouter à la les réponses, seriez-vous capable de citer la clause standard C99, qui stipule que l'instruction printf affiche le type float à un maximum de précision par défaut si aucune précision n'est indiquée?
  • Bien que @chux pénètre, il y a quelques assez compliqué de mathématiques à l'effectif de la précision pour votre double. Comme votre double devient extrêmement large (très loin de 1.0), elle est moins précise dans la partie décimale (la valeur de la partie inférieure à 1.0). Donc vous ne pouvez pas vraiment obtenir une réponse satisfaisante ici, parce que votre question a une hypothèse fausse en elle (à savoir que tous les floats/doubles sont créés égaux)
  • Je m'excuse, je pense que vous avez peut-être mal compris la question. Je suis intéressé par la précision de la sortie (c'est à dire le nombre de caractères imprimés), pas la précision des types de données (c'est à dire la précision float/double représentent la valeur vraie).
  • %.12f va, il suffit d'imprimer 12 décimales, peu importe si cette précision est disponible à partir de votre type de variable ou pas. Vous devez considérer que le "imprimé" précision disponible (# caractères imprimés) est complètement arbitraire. La précision disponible dans un float ou double dépend du nombre de bits de la mantisse utilisé dans le type de données, ainsi que sur la taille de la nombre. printf ne pas tenir compte de la taille du nombre cependant. Si la réponse à votre question est n, vous ne pouvez pas imprimer un nombre avec printf "au maximum de précision possible"
  • Gris Voir vous ai fait une petite mise à jour en insistant sur float. Pour float, je vous conseille d'utiliser printf("%.*e", OP_FLT_Digs-1, x) où OP_FLT_Digs est dérivé conséquence que OP_DBL_Digs ci-dessous. À mon humble avis, votre point est float-text-float aller-retour et c'est exactement, par C spec, ce xxx_DECIMAL_DIG fournir. Bien sûr %a est grande, mais je suppose que vous préférez décimal texte.
  • Gris C11dr 5.2.4.2.2 "... nombre de chiffres après la virgule, n, telle que tout nombre à virgule flottante avec p radix b chiffres peuvent être arrondie à un nombre à virgule flottante avec n chiffres après la virgule et le dos encore une fois sans changement de la valeur, p log10 b b est une puissance de 10 ⎡1 + p log10 b⎤ sinon FLT_DECIMAL_DIG 6 DBL_DECIMAL_DIG 10 LDBL_DECIMAL_DIG 10 ..." La 6,10,10 sont les valeurs minimales.
  • Je suis surpris que personne n'a (semble-t-il) a fait référence à l'article "Ce que Chaque Programmeur Doit Savoir à Propos de l'Arithmétique à virgule Flottante" - une réédition de ce qui peut être trouvé à l'adresse docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#1251. Il y a aussi, il semble un site web qui tente de simplifier ce qui peut être trouvé à l'adresse floating-point-gui.de (non ce n'est pas en allemand mais en anglais).

InformationsquelleAutor Vilhelm Gray | 2013-05-30