C comstackdor error (aritmética de punto flotante)?

#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; } 

Este código debería tener una salida de: 312

pero algo no va bien … estoy usando el comstackdor devcpp 4.9.9.2 …

Kernighan y Plauger dicen, en su antiguo pero clásico libro “Los elementos del estilo de progtwigción” , que:

  • Un viejo y sabio progtwigdor dijo una vez que “los números de punto flotante son como pequeñas stacks de arena; cada vez que mueves una, pierdes un poco de arena y ganas un poco de suciedad”.

También dicen:

  • 10 * 0.1 es casi nunca 1.0

Ambos dichos señalan que la aritmética de punto flotante no es precisa.

Tenga en cuenta que algunas CPU modernas (IBM PPC) tienen IEEE 754: 2008 aritmética de coma flotante decimal incorporada. Si usa los tipos correctos, entonces su cálculo será exacto.

La aritmética de punto flotante es confusa y no se garantiza que se comporte de manera intuitiva.

Este es un buen documento de referencia: lo que todo científico informático debe saber sobre la aritmética de punto flotante . Es un documento largo, porque es un problema complicado.

En resumen: no utilice valores de punto flotante si confía en valores exactos .

Entonces, ¿multiplicaste 0.31199999999999999999999916591441391574335284531116485595703125 por 1000 y lo truncaste y obtuviste 311? No veo dónde está el problema.