Esto se debe a 2 factores: primero la conversión entre bases numéricas, y segundo la forma en que el número binario se almacena en la computadora (en todas partes de la computadora desde el disco, a través de la RAM y en los registros de la CPU). La combinación de estos factores es lo que produce esos números de “casi pero sin cigarro” que encuentras.
La conversión entre bases significa que cualquier dígito tiene un alcance mayor o menor dependiendo del factor base. Por ejemplo, en base diez (decimal, como está acostumbrado a escribir en estos días) cualquier dígito tiene un alcance de 10 valores posibles. Pero en las computadoras todo funciona en binario (base 2, es decir, solo 2 valores posibles por dígito … de los cuales 0 o 1).
Ahora digamos que convierte 0.6 en decimal a binario … esto produciría una cadena de dígitos sin fin:
0.1001100110011001100110 … continuó hasta el infinito
- Estoy interesado en algoritmos. Planeo hacer una maestría en informática teórica en una de las 20 mejores universidades. ¿Cuán significativamente ayudará a hacerme digno de la industria?
- ¿Cómo se llama el número de elementos en un conjunto?
- ¿Cuáles son algunos temas imprescindibles en matemática discreta y probabilidad de programación competitiva?
- ¿De qué manera aprender matemáticas avanzadas me haría un mejor programador?
- ¿Qué habilidades matemáticas te ayudarán a prepararte para obtener un título en ciencias de la computación?
Si ese fuera el único problema, entonces tendría algo como números de precisión arbitrarios en las computadoras. En ese caso, un solo valor consumiría toda su RAM y su computadora se bloquearía, no importa, una simple multiplicación tardaría días en completarse. Entonces, en lugar de quedarse con números arbitrarios (es decir, “infinitos” hasta la capacidad de RAM), las computadoras usan números “finitos” dados solo un conjunto fijo de dígitos. La forma más común en que una computadora almacena estas fracciones es usando números de coma flotante de la siguiente manera (coma flotante de 32 bits IEEE 754):
[un dígito para el signo +/-] [8 dígitos para el exponente] [23 dígitos para la mantisa o valor]
Entonces, en este caso, 0.6 se almacena como:
[0] [01111110] [00110011001100110011010]
Por lo tanto, ese último conjunto de dígitos simplemente se tira, llamado truncado. Ahora, ¿qué sucede cuando vuelves a convertir eso a decimal para que pueda mostrarse para tu placer de lectura? Si lo muestra con la máxima precisión decimal:
0.6000000238418579
Vaya, eso no era lo que querías, ¿verdad?
Lamentablemente es una compensación. O usa este número truncado incorporado para algo “casi” exacto, o tiene computadoras que funcionan extremadamente lentamente (si es que lo hacen) porque los números no encajan bien en binario.
Puede obtener “más” exacto aumentando el número permitido de dígitos, por ejemplo, utilizando un flotante de 64 bits (a veces llamado doble). Pero nunca puedes obtener la perfección para todos los valores posibles. Y tampoco ayuda ir con otras bases, por ejemplo, incluso el decimal tiene sus límites: ¿qué sucede con 1.0 / 3? Se vuelve:
0.333333 … repetido hasta el infinito
Pero en ternario (base 3) 1/3 se expresa exactamente como 0.1. Y 2/3 = 0.2
Entonces, cuando un número no es un factor de la base (y viceversa), tiende a encontrar estos números irracionales en esa base. Por lo tanto, no importa qué base elija, siempre tendrá este problema.
Una forma alternativa de almacenar estos números es como pares en forma de x / y. En tal caso, “puede” almacenar 1/3 como [1] [3] o en binario [0001] [0011]. Pero aún así, esto debe calcularse cada vez que usa ese número, es decir, toma más tiempo, por lo tanto, la computadora funciona más lentamente. También se han utilizado otros medios, por ejemplo, BCD http://en.wikipedia.org/wiki/Bin…
Pero todos tienen límites o incluso problemas de rendimiento extremos, como la precisión arbitraria. Por lo tanto, trate de aprender a vivir con ellos, por ejemplo, nunca espere que un punto flotante sea exacto y, en su lugar, verifique que esté dentro de un rango esperado.