El flotador no cambia cuando le agrego 0.1

Soy bastante novato en c. Así que cuando escribo una demostración de juego pequeño, me enfrento a un problema realmente extraño.

void testC() { float a = 825300160; float b = a + 0.1; assert(a != b); } 

La afirmación anterior no puede ser aprobada. Muy extraño.
Mi entorno es mac os ml. gcc 4.2.1

La porción fraccionaria de un float consiste en 23 bits. Necesita 30 bits para representar 825300160, por lo que se elimina la parte menos significativa del número. Agregar .1 no hace una diferencia, debe agregar aproximadamente 32 para que cambie el número:

 float a = 825300160; float b = a + 31.5; assert(a != b); // No change is detected float c = a + 32; assert(a != c); // Change is detected 

No hay suficiente precisión en el tipo de flotador. Si realmente necesita distinguir una adición de 0.1 a un número tan grande como 825300160, use doble.

Como muestra este sitio , tanto a como b se representan como

 0 10011100 10001001100010001010011 

en el estándar IEEE para flotadores, donde el primer bit es el signo, los siguientes 8 son el exponente y los 23 restantes la mantisa. Simplemente no hay suficiente espacio en esos 23 bits para representar la diferencia, porque el exponente es muy grande.