275 votos

¿Por qué no puede números decimales se pueden representar exactamente en binario?

Ha habido varias preguntas publicadas para ASÍ acerca de la representación de punto flotante. Por ejemplo, el número decimal 0.1 no tiene una representación binaria exacta, por lo que es peligroso utilizar el operador == para comparar a otro número en punto flotante. Puedo entender los principios detrás de la representación de punto flotante.

Lo que yo no entiendo es por qué, desde una perspectiva matemática, son los números a la derecha del punto decimal más "especiales" que los de la izquierda?

Por ejemplo, el número 61.0 tiene una exacta representación binaria debido a que la porción integral de cualquier número siempre es exacta. Pero el número 6.10 no es exacto. Todo lo que hice fue mover el decimal un lugar y de repente me he ido de Exactopia a Inexactville. Matemáticamente, no debería haber ninguna diferencia intrínseca entre los dos números, son sólo números.

Por el contrario, si puedo mover el decimal un lugar en la otra dirección para producir el número 610, todavía estoy en Exactopia. Que yo pueda seguir adelante en esa dirección (6100, 610000000, 610000000000000) y todavía están exacto, exacto, exacto. Pero tan pronto como el decimal de la cruza de un cierto umbral, los números no son exactos.

¿Qué está pasando?

Edit: para aclarar, quiero estar lejos de la discusión acerca de los estándares de la industria de las representaciones, tales como IEEE, y seguir con lo que yo creo que es la matemática "pura". En base 10, la posición de valores son:

... 1000  100   10    1   1/10  1/100 ...

En binario, serían:

... 8    4    2    1    1/2  1/4  1/8 ...

Asimismo, no hay límites arbitrarios colocado en estos números. Las posiciones aumentar indefinidamente a la izquierda y a la derecha.

349voto

Jon Skeet Puntos 692016

Los números decimales pueden ser exactamente representados, si se dispone de espacio suficiente - no sólo por flotante binario de los números de punto. Si utiliza un flotante decimal tipo de punto (p. ej. System.Decimal en .NET), a continuación, un montón de valores que no pueden ser exactamente representados en binario de punto flotante puede ser exactamente representados.

Vamos a mirar de otra manera - en base 10, que es probable que sea cómodo, que no puede expresar 1/3 exactamente. Es 0.3333333... (recurrente). La razón por la que no puede representar 0.1 como un binario de número de punto flotante es exactamente por la misma razón. Usted puede representarse a 3 y 9, y el 27 de exactamente - pero no de 1/3, 1/9, o 1/27.

El problema es que el 3 es un número primo que no es un factor de 10. Eso no es un problema cuando se desea multiplicar un número por 3: siempre se puede multiplicar por un número entero sin problemas. Pero cuando se divide por un número, que es primo y no es un factor de su base, que se puede ejecutar en los problemas (y va a hacerlo si se intenta dividir 1 por ese número).

Aunque 0.1 es por lo general usado como el ejemplo más simple de un número decimal exacto, que no pueden ser exactamente representados en binario de punto flotante, podría decirse 0.2 es un simple ejemplo de como es 1/5 y 5 es el primer que causa problemas entre decimal y binario.


Nota de lado a lidiar con el problema de finito representaciones:

Algunos punto decimal flotante tipos tienen un tamaño fijo como System.Decimal otros como java.math.BigDecimal son "arbitrariamente grande" -, pero se llegará a un límite en algún punto, ya sea en la memoria del sistema o el tamaño máximo teórico de una matriz. Este es un totalmente punto separado del principal de esta respuesta, sin embargo. Incluso si hubiera realmente un número arbitrariamente grande de bits para jugar, todavía no podía representar decimales 0.1 exactamente en una flotante binario representación de punto. Compare eso con el revés: dado un número arbitrario de dígitos decimales, se puede representar exactamente cualquier número que es exactamente representable como un flotante binario de punto.

33voto

James M. Puntos 2104

La razón por la imprecisión es la naturaleza de número de bases. En base 10, no se puede representar exactamente 1/3. Se convierte en 0.333... sin Embargo, en la base 3, 1/3 es exactamente representados por 0.1 y 1/2 es una infinitamente repetida decimal (tresimal?). Los valores que se pueden finitely representado dependen de la cantidad de factores primos de la base, de la base 30 [2 * 3 * 5] puede representar más fracciones de la base 2, o de base 10. Aún más para la base 210 [2 * 3 * 5 * 7].

Este es un tema separado de la "error de punto de flotante". La inexactitud no es debido a un par de miles de millones de los valores se distribuyen en un rango mucho mayor. Así que si usted tiene 23 bits para la mantisa, que sólo puede representar alrededor de 8,3 millones de valores distintos. Luego de 8 bits de exponente ofrece 256 opciones para la distribución de los valores. Este esquema permite que el más preciso de los decimales a ocurrir cerca de 0, así que usted puede casi representa el 0,1.

23voto

AakashM Puntos 32891

Por ejemplo, el número 61.0 tiene una exacta representación binaria debido a que la porción integral de cualquier número siempre es exacta. Pero el número 6.10 no es exacto. Todo lo que hice fue mover el decimal un lugar y de repente me he ido de Exactopia a Inexactville. Matemáticamente, no debería haber ninguna diferencia intrínseca entre los dos números, son sólo números.

Vamos paso por un momento en los detalles de las bases 10 y 2. Que vamos a hacer en base a b, lo que los números han de terminación de las representaciones, y lo que los números no? Un momento de reflexión nos dice que un número x tiene una terminación b-representación si y sólo si existe un entero n tal que x b^n es un número entero.

Así, por ejemplo, x = 11/500 tiene una terminación 10-representación, ya que podemos recoger n = 3 y, a continuación, x b^n = 22, un número entero. Sin embargo, x = 1/3 no, porque lo n recogemos no será capaz de deshacerse de los 3.

Este segundo ejemplo nos lleva a pensar acerca de los factores, y podemos ver que para cualquier racional x = p/q (considerado en términos mínimos), podemos responder a la pregunta comparando el primer factorisations de b y q. Si q tiene factores primos no en el primer factorización de b, nunca seremos capaces de encontrar una adecuada n de deshacerse de estos factores.

Por lo tanto para la base 10, cualquiera p/q donde q tiene factores primos distintos de 2 o 5 no tienen un carácter de representación.

Así que ahora, volviendo a las bases 10 y 2, podemos ver que cualquier racional con una terminación 10-representación será de la forma p/q exactamente cuándo q sólo ha 2s y 5s en su primer factorización; y ese mismo número, tendrá un carácter de 2-representatiion exactamente cuándo q sólo ha 2s en su primer factorización.

Pero uno de estos casos es un subconjunto de la otra! Siempre que

q sólo ha 2s en su primer factorización

esto, obviamente, es también cierto que

q sólo ha 2s y 5s en su primer factorización

o, dicho de otra manera, cuando p/q tiene una terminación 2-representación, p/q tiene una terminación 10-representación. A la inversa, sin embargo, no espera - siempre q tiene un 5 en su primer factorización, tendrá una terminación 10-representación , pero no un carácter 2-de la representación. Este es el 0.1 ejemplo mencionado por otras respuestas.

Así que ahí tenemos la respuesta a su pregunta - porque los factores primos de 2 son un subconjunto de los factores primos de 10, todos la 2-terminación de los números 10-la terminación de los números, pero no viceversa. No se trata de 61 frente a 6,1 - se trata de 10 contra 2.

Como nota final, si por algún capricho de la gente usa (por ejemplo) de la base de 17 años, pero nuestros equipos de base utilizado, 5, su intuición nunca han sido descarriados por esto - no sería ninguna (no-cero, no entero) los números que terminó en ambos casos!

15voto

TM. Puntos 20051

La raíz (matemática) la razón es que cuando se trabaja con números enteros, son countably infinito.

Lo que significa que, a pesar de que hay una cantidad infinita de ellos, podemos "contar" todos los elementos de la secuencia, sin saltarse ninguna. Eso significa que si queremos obtener el elemento de la 610000000000000ª posición en la lista, podemos averiguar a través de una fórmula.

Sin embargo, los números reales son uncountably infinito. No se puede decir "dame el número real en la posición 610000000000000" y obtener una respuesta. La razón es porque, incluso entre 0 y 1, hay un número infinito de valores, al considerar los valores de punto flotante. Lo mismo es válido para cualquiera de los dos números de punto flotante.

Más info:

http://en.wikipedia.org/wiki/Countable_set

http://en.wikipedia.org/wiki/Uncountable_set

Actualización: Mis disculpas, me parece haber interpretado mal la pregunta. Mi respuesta es acerca de por qué no podemos representar a cada una de real valor, no me había dado cuenta de que de punto flotante se clasifica automáticamente como racional.

9voto

ntownsend Puntos 2424

A repetir lo que dije en mi comentario para el Señor Skeet: se puede representar 1/3, 1/9, 1/27, o cualquier racionales en notación decimal. Lo hacemos mediante la adición de un símbolo extra. Por ejemplo, una línea a través de los dígitos que se repiten en la expansión decimal de un número. Lo que necesitamos para representar los números decimales como una secuencia de números binarios son 1) una secuencia de números binarios, 2) una base de punto, y 3) cualquier otro símbolo para indicar la repetición de parte de la secuencia.

Hehner la comilla de la notación es una manera de hacer esto. Él utiliza una cita símbolo para representar a la parte que se repite la secuencia. El artículo: http://www.cs.toronto.edu/~hehner/ratno.pdf y la entrada de la Wikipedia: http://en.wikipedia.org/wiki/Quote_notation.

No hay nada que dice que no se puede añadir un símbolo de nuestro sistema de representación, por lo que podemos representar decimales en racionales utilizando exactamente binario cita de notación, y viceversa.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X