Es porque los valores de punto flotante no son representaciones exactas del número. Todos los números base diez deben estar representados en la computadora como números base 2. Es en esta conversión que se pierde la precisión.
Lea más sobre esto en http://en.wikipedia.org/wiki/Floating_point
Un ejemplo (de encontrarse con este problema en mis días de VB6)
Convertir el número 1.1 a una precisión simple número en coma flotante que necesitamos convertirlo a binario. Hay 32 bits que deben crearse.
Bit 1 es el bit de signo (es negativo [1] o de posición [0]) Bits 2-9 son para el valor del exponente Bits 10-32 son para la mantisa (aka significand, básicamente el coeficiente de Entonces, para 1.1, el valor del punto flotante simple se almacena de la siguiente manera (este es el valor truncado, el compilador puede redondear el bit menos significativo detrás de las escenas, pero lo único que hago es truncarlo, lo cual es un poco menos preciso). pero no cambia los resultados de este ejemplo):
s --exp--- -------mantissa--------
0 01111111 00011001100110011001100
Si no hielo en la mantisa existe el patrón de repetición 0011. 1/10 en binario es como 1/3 en decimal. Continúa para siempre Entonces, para recuperar los valores del valor de coma flotante de precisión simple de 32 bits, primero debemos convertir el exponente y la mantisa en números decimales para poder usarlos.
signo = 0 = un número positivo
exponente: 01111111 = 127
mantisa: 00011001100110011001100 = 838860
Con la mantisa tenemos que convertirlo en un valor decimal. La razón es que hay un entero implícito por delante del número binario (es decir, 1.00011001100110011001100). El número implícito se debe a que la mantisa representa un valor normalizado que se utilizará en la notación científica: 1.0001100110011 .... * 2^(x-127).
Para obtener el valor decimal de 838860 simplemente dividimos por 2^-23 ya que hay 23 bits en la mantisa. Esto nos da 0.099999904632568359375. Agregue el implícito 1 a la mantisa nos da 1.099999904632568359375. El exponente es 127 pero la fórmula requiere 2^(x-127).
Así que aquí es la matemática:
(1 + 099999904632568359375) * 2^(127-127)
1,099999904632568359375 * 1 = 1,099999904632568359375
Como se puede ver 1.1 no es realmente almacena en el valor del punto flotante simple como 1.1.
Regla general: nunca comparas los números de coma flotante de manera 'exacta'. Simplemente no tiene sentido. Siempre use algunos 'épsilon' – valdo
@valdo: Por lo general, es un mal consejo sin un análisis mucho más completo. –
'void main()' es incorrecto. 'int main (void)' es correcto. –