web-dev-qa-db-fra.com

Existe-t-il une différence dans l'utilisation de% f,% e,% g,% E ou% G avec scanf?

En C, existe-t-il une différence entre les spécificateurs de format% f,% e,% g,% E et% G utilisés pour la lecture dans une variable float avec scanf? C'est-à-dire que le comportement de l'extrait de code

float x;
scanf("%<one of f, e, g, E, G>", &x);

jamais dépendre du choix du spécificateur?

J'ai d'abord supposé que% f n'interpréterait correctement la notation décimale, et% e n'interpréterait que la notation scientifique correctement, mais sur mon système, chacun d'entre eux fonctionne correctement dans les deux cas. Mais peut-être que mon système est juste libéral ...

Je n'ai trouvé aucune déclaration à ce sujet dans mes livres ou sur le Web ...

9
lee77

La réponse ci-dessus fait référence à C++, mais il en va de même pour C.

De "7.19.6.2 La fonction fscanf" dans le "Version finale du standard C99 avec les corrigenda TC1, TC2 et TC3 inclus, au format brouillon" (lien copié de http: //fr.wikipedia .org/wiki/C99 ):

a, e, f, g
Correspond à un nombre à virgule flottante éventuellement signé, à l'infini, Ou NaN, dont le format est identique à celui attendu pour la séquence de sujet De la fonction strtod. L'argument correspondant doit être un pointeur Sur flottant.

Les spécificateurs de conversion A, E, F, G, etXsont également valides et Se comportent de la même manière que, respectivement, a, e, f, g, et x .

Donc, %f, %e, %g, %E, %G tous se comportent de manière identique lorsque numérisation nombres, comme vous l'avez expérimenté.

9
Martin R

f,e,g tous sont pour numéro à virgule flottante

De la doc : -

Une série de chiffres décimaux, contenant éventuellement un point décimal, Éventuellement précédée d’un signe (+ ou -) et éventuellement suivie du caractère E ou E et d’un entier décimal (ou de certains des autres séquences supportées par strtod). Les implémentations conformes à C99 prennent également en charge le format hexadécimal à virgule flottante Lorsqu'elles sont précédées de 0x ou 0X.

Vérifiez également cette référence qui indique qu'elle (f,e,g) correspond à un nombre à virgule flottante.

2
Rahul Tripathi

C affiche les variables float et double à six décimales. Ceci ne fait PAS référence à la précision (exactitude) dont le nombre est réellement stocké, mais uniquement au nombre de décimales que printf() utilise pour afficher ces types de variable.

Le programme suivant illustre comment les différents types de données sont déclarés et affichés:

#include <stdio.h>

main()
{

    float   a = 23.567;
    double  b = 11e+23;

    printf("Float variable is %f\n", a);
    printf("Double variable is %e\n", b);
}

SORTIE 

Float variable is 23.567000
Double variable is 11.000000e23
1
Keshav Bansal

% f: il affiche le nombre correspondant sous forme de nombre décimal à virgule flottante, par ex. 214.52

% e: il imprime le nombre en notation scientifique, par exemple. 214,52e + 2.

% g: il imprime le nombre correspondant le plus court parmi deux, par ex. Dans les deux exemples ci-dessus, si je veux imprimer le nombre par le biais de% g, il s'agira de 214,52 mais pas de 2.145e + 2 car il est plus long.

#include<stdio.h>
void main()
{

float f=12.5;

    printf("%f\n",f);
    printf("%e\n",f);
    printf("%g\n",f);
}

Sortie:

12.500000

1.250000e + 001

12.5

0
Sameer Sharma