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: