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 ?

Était-ce utile?

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 doubles.C'est le type par défaut d'une constante à virgule flottante - si vous vouliez qu'elles soient floats, 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top