C: convertir le double en float, en préservant la précision du point décimal

Je voulais convertir double en float en C, mais je voulais conserver le point décimal exactement comme possible, sans aucune modification …

par exemple, disons que j’ai

double d = 0.1108; double dd = 639728.170000; double ddd = 345.2345678 

corrigez-moi maintenant si je me trompe, je sais que la précision de la virgule flottante est d’environ 5 chiffres après le point. Puis-je obtenir ces cinq chiffres après le point exactement comme le double? de sorte que les résultats ci-dessus sont les suivants

  float f = x(d); float ff = x(dd); float fff = x(ddd); printf("%f\n%f\n%f\n", f, ff, fff); 

il devrait imprimer

  0.1108 639728.17000 345.23456 

tous les chiffres après la limite de précision (que je suppose 5) seraient tronqués.

float et double ne stocke pas de décimales. Ils stockent des emplacements binarys : float correspond à (en supposant IEEE 754) 24 bits significatifs (7,22 décimales) et double à 53 bits significatifs (15,95 chiffres significatifs).

La conversion de double en float vous donnera le float le plus proche possible, ainsi l’arrondir ne vous aidera pas. En allant dans l’autre sens, vous obtiendrez des “bruits” dans la représentation décimale.

 #include  int main(void) { double orig = 12345.67; float f = (float) orig; printf("%.17g\n", f); // prints 12345.669921875 return 0; } 

Pour obtenir une double approximation de la belle valeur décimale souhaitée, vous pouvez écrire quelque chose comme:

 double round_to_decimal(float f) { char buf[42]; sprintf(buf, "%.7g", f); // round to 7 decimal digits return atof(buf); } 

Un float généralement une précision d’environ 7 chiffres, quelle que soit la position du point décimal. Donc, si vous voulez une précision de 5 chiffres après la décimale, vous devez limiter la plage des nombres à moins de quelque part autour de +/- 100.

Les nombres à virgule flottante sont représentés dans la notation scientifique par un nombre de sept chiffres significatifs seulement multiplié par un nombre plus grand qui représente la place de la virgule décimale. Plus d’informations à ce sujet sur Wikipedia:

http://en.wikipedia.org/wiki/Floating_point