Pourquoi ce code C produit-il un double au lieu d'un float ?
Question
celsius = (5.0/9.0) * (fahr-32.0);
Est-ce simplement un choix de développement décidé par les développeurs C ou y a-t-il une raison à cela ?Je pense qu'un flottant est plus petit qu'un double, cela pourrait donc être pour éviter les débordements causés par le fait de ne pas savoir quel format décimal utiliser.Est-ce la raison, ou est-ce que j'oublie quelque chose ?
La solution
Je pense que la raison est de garantir que tout résultat puisse être pris en compte.le choix naturel est donc double car il s’agit du type de données le plus volumineux.
Autres conseils
celsius = (5.0/9.0) * (fahr-32.0);
Dans cette expression, 5.0
, 9.0
, et 32.0
sont double
s.C'est le type par défaut d'une constante à virgule flottante - si vous vouliez qu'elles soient float
s, alors vous utiliseriez le F
suffixe:
celsius = (5.0F/9.0F) * (fahr-32.0F);
Notez que si fahr
était un double
, alors le résultat de cette dernière expression serait toujours être un double
:comme Vaibhav l'a noté, les types sont promus de manière à éviter une perte potentielle de précision.
La raison pour laquelle l'expression est convertie en double précision est que les littéraux spécifiés sont des valeurs double précision par défaut.Si vous spécifiez les littéraux utilisés dans l'équation comme flottants, l'expression renverra un flottant.Considérez le code suivant (Mac OS X utilisant gcc 4.01).
#include <stdio.h>
int main() {
float celsius;
float fahr = 212;
printf("sizeof(celsius) ---------------------> %d\n", sizeof(celsius));
printf("sizeof(fahr) ------------------------> %d\n", sizeof(fahr));
printf("sizeof(double) ----------------------> %d\n", sizeof(double));
celsius = (5.0f/9.0f) * (fahr-32.0f);
printf("sizeof((5.0f/9.0f) * (fahr-32.0f)) --> %d\n", sizeof((5.0f/9.0f) * (fahr-32.0f)));
printf("sizeof((5.0/9.0) * (fahr-32.0)) -----> %d\n", sizeof((5.0/9.0) * (fahr-32.0)));
printf("celsius -----------------------------> %f\n", celsius);
}
La sortie est :
sizeof(celsius) ---------------------> 4
sizeof(fahr) ------------------------> 4
sizeof(double) ----------------------> 8
sizeof((5.0f/9.0f) * (fahr-32.0f)) --> 4
sizeof((5.0/9.0) * (fahr-32.0)) -----> 8
celsius -----------------------------> 100.000008
Les constantes à virgule flottante doivent avoir la plus haute précision disponible.Le résultat peut être attribué à un flotteur sans problème inutile.
À l'époque de K&Rv1, il était encouragé à utiliser de manière interchangeable float/double étant donné que toutes les expressions avec des types à virgule flottante étaient toujours évaluées en utilisant une représentation « double », un problème dans les cas où l'efficacité est primordiale.Une constante à virgule flottante sans suffixe f, F, l ou L est de type double.Et, si la lettre f ou F est le suffixe, la constante est de type float.Et s'il est suffixé par la lettre l ou L, il est de type long double.