#include int main() { double fract=0; int tmp; //scanf("%lf",&fract); fract=0.312; printf("%lf",fract); printf("\n\n"); while(fract>0){ fract*=(double)10; printf("%d ",(int)fract); fract-=(int)fract; } getch(); return 0; }
ce code devrait avoir une sortie de: 312
mais quelque chose ne va pas bien .. J’utilise le compilateur devcpp 4.9.9.2 …
Kernighan & Plauger disent, dans leur livre ancien mais classique “Les éléments du style de programmation” , que:
Ils disent aussi:
Les deux expressions soulignent que l’arithmétique en virgule flottante n’est pas précise.
Notez que certains processeurs modernes (IBM PPC) intègrent l’arithmétique en virgule flottante décimale IEEE 754: 2008. Si vous utilisez les types corrects, votre calcul sera exact.
L’arithmétique en virgule flottante est source de confusion et ne garantit pas un comportement intuitif.
Voici un bon document de référence: Ce que tout informaticien devrait savoir sur l’arithmétique en virgule flottante . C’est un long document, parce que c’est un problème compliqué.
En résumé: n’utilisez pas de valeurs en virgule flottante si vous vous basez sur des valeurs exactes .
Donc, vous avez multiplié par 0,3,31999999999999999999895916591441391574335284531116485595703125 et vous l’avez tronqué pour obtenir 311? Je ne vois pas où est le problème.