Considere lo que significan los dígitos individuales de un número como 12,34. Su valor es $1\cdot10^1 + 2\cdot10^0 + 3\cdot10^{-1} + 4\cdot10^{-2}$ . Esto es lo que aprendiste en la escuela primaria sobre el "lugar de las unidades" y el "lugar de las decenas", pero escrito en una notación matemática más formal. Los ordenadores manejan los números en coma flotante de la misma manera, sólo que son mucho mejores en base 2 que en base 10, así que hacen exactamente el mismo proceso en binario. 5,25 se divide en $1\cdot2^1 + 0\cdot2^1 + 1*\cdot2^0 + 0\cdot2^{-1} + 1\cdot2^{-2}$ . Si lo reescribiera en la forma decimal normal, pero utilizando valores de base 2 en lugar de base 10, $5.25_{10}$ se escribiría como $101.01_2$ (La base se anota aquí con un subíndice, que es una notación muy común cuando se trabaja con diferentes bases. Ayuda a mantener los números en orden). Así es como los ordenadores suelen abordar los números en coma flotante.
Si te pregunto cuánto es 1/3 como decimal, dirías algo así como $0.33333..._{10}$ Sin embargo, si siguieras escribiendo 3's, te quedarías sin espacio, así que probablemente dirías "está cerca de $0.33333_{10}$ ." Los ordenadores hacen lo mismo. Mientras que 1/2 en base2 es $0.1_2$ y 1/8 es $0.001_2$ en base 2, no todos los números funcionan tan limpiamente. En particular, 3/10 ( $0.3_{10}$ en decimal) es igual a $0.010011001100..._2$ que debe ser redondeado. Son estos errores de redondeo los que causan los efectos inusuales que se ven.
Como regla general, nunca se debe confiar en la equivalencia exacta con ==
para determinar si dos números en coma flotante son iguales, debido a estos errores de redondeo. Uno siempre los compara con alguna tolerancia.
Muchas CPUs tienen un modo "decimal" para sus números en coma flotante que utilizan la base 10 en lugar de la base 2. Esto puede ser más lento, o de menor precisión, pero es una solución popular en situaciones como la banca, donde el manejo exacto de fracciones de un centavo tiene que coincidir exactamente. Dado que es natural que vigilemos los errores de redondeo en decimales, esto hace que los números se comporten de forma más intuitiva. Sin embargo, en general esto se ha dejado de lado. Casi todo el mundo utiliza la representación binaria normal IEE-754 de los números en coma flotante, porque es un formato muy bien redondeado. Los que necesitan exactitud suelen utilizar en su lugar la matemática de punto fijo, que garantiza resultados exactos utilizando la aritmética de enteros.
3 votos
Aquí hay un bonito vídeo que explica cómo se producen estos errores de punto flotante. Resumiendo: se debe a los "decimales repetidos" truncados cuando los números se expresan en binario.
3 votos
Los ordenadores tienen que hacer un montón de cosas raras internamente para poder manejar la aritmética de coma flotante, y nunca pueden hacerlo perfectamente (siempre habrá algún error para los decimales no terminados). Las diferencias que ves ahí son el error del producto en los métodos particulares que se utilizan.
6 votos
Enlace obligatorio a stackoverflow: ¿Está rota la matemática de punto flotante?
2 votos
¿Por qué 3*(1/3) = 0,99999999 en decimal?
0 votos
Sé que esto no es tan importante, pero en aras de la integridad Norma IEEE para la aritmética de punto flotante (IEEE 754)
0 votos
@JustinBenfield La razón por la que no pueden hacerlo perfectamente es que la aritmética de punto flotante es básicamente imperfecta por definición. Son perfectamente precisos si se representan los números como pares de enteros (fracciones).
5 votos
Lo que todo informático debe saber sobre la aritmética en coma flotante
1 votos
@PyRulez La aritmética de punto flotante funciona perfectamente si lo haces a tous valores de posición de los números relevantes, pero eso requiere un espacio de almacenamiento y un número de operaciones infinitos, lo que no es factible para un ordenador, por lo que hay que hacer algunos sacrificios.