Dans le programme donné, pourquoi ai-je obtenu des résultats différents pour chacun des printf
s?
#include <stdio.h>
int main()
{
float c = 4.4e10;
printf("%f\n", c);
printf("%f\n", 4.4e10);
return 0;
}
Et il affiche la sortie suivante:
44000002048.000000
44000000000.000000
4.4e10
s'agit d'unedouble
constante qui est convertie enfloat
lors de l'initialisation dec
mais conservée comme unedouble
fois passée àprintf
. Cependant, vous voudrez peut-être aussi savoir que l'ajout d'unf
suffixe en fait unefloat
constante: l'impression4.4e10f
affichera la même valeur que celle résultant de l'initialisationc
à4.4e10f
. Il peut être important de distinguer lesfloat
constantes desdouble
constantes pour effectuer un travail de qualité avec l'arithmétique à virgule flottante.double
àfloat
se produit en langage C? Ou voulez-vous savoir quelles valeurs résultent de la conversion, c'est-à-dire quels effets la conversion a? Ou autre chose?C
nous utilisionsprintf("%f",x)
pour unfloat
etprintf("%lf",x)
pour undouble
. Quand les choses ont-elles changé? Et comment imprimer explicitement un (simple)float
-printf("%hf",x)
??%lf
dans printf est la même chose que%f
. Unfloat
dans un argument variable est converti en undouble
par le compilateur, tout comme unshort
est converti en unint
.Réponses:
A
float
est un type qui contient un nombre à virgule flottante 32 bits, tandis que la constante4.4e10
représente adouble
, qui contient un nombre à virgule flottante 64 bits (c'est-à-dire un nombre à virgule flottante à double précision)Lorsque vous attribuez
4.4e10
àc
, la valeur4.4e10
ne peut pas être représentée avec précision (une erreur d'arrondi dans un paramètre appelé la mantisse) et la valeur la plus proche possible (44000002048) est stockée. Lorsqu'il est transmis àprintf
, il est promu à nouveaudouble
, y compris l'erreur d'arrondi.Dans le second cas, la valeur est a
double
tout le temps, sans rétrécissement ni élargissement, et il se trouve que adouble
peut représenter exactement la valeur.S'il s'agit d'un comportement indésirable, vous pouvez le déclarer
c
comme undouble
pour un peu plus de précision (mais attention, vous finirez toujours par atteindre des limites de précision).la source
Vous imprimez en fait les valeurs de deux types différents ici.
Dans le premier cas, vous attribuez une valeur à une variable de type
float
. La précision de afloat
est d'environ 6 ou 7 chiffres décimaux, donc à moins que la valeur ne puisse être représentée exactement, vous verrez la valeur la plus proche qui peut être représentée par ce type.Dans le second cas, vous passez la constante de
4.4e10
typedouble
. Ce type a environ 16 chiffres décimaux de précision et la valeur se situe dans cette plage, la valeur exacte est donc imprimée.la source