Bogue du compilateur C (arithmétique en virgule flottante)?

#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:

  • Un vieux programmeur avisé a un jour déclaré: “Les nombres en virgule flottante sont comme des petits tas de sable. Chaque fois que vous en déplacez un, vous perdez un peu de sable et gagnez un peu de terre”.

Ils disent aussi:

  • 10 * 0,1 n’est presque jamais 1,0

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.