2012-01-18 112 views
6

Cuando trabajo con el exceso de representación de números enteros, uso un sesgo de 2 n-1. Sin embargo, el estándar IEEE 754 utiliza 2 n-1 - 1.¿Por qué el estándar IEEE 754 usa un sesgo 127?

El único beneficio que puedo pensar es un rango positivo más grande. ¿Hay alguna otra razón por la cual se tomó esa decisión?

Respuesta

6

La razón es tanto Infinities/NaNs como un subdesbordamiento gradual.

Si utiliza exponentes para mostrar los valores enteros (n> = 0) y fraccionarios (n < 0), tiene el problema de que necesita un exponente para 2^0 = 1. Entonces el rango restante es impar, dando usted puede elegir el rango más grande para fracciones o enteros. Para precisión simple, tenemos 256 valores, 255 sin el exponente 0. Ahora IEEE754 reservó el máximo exponente (255) para valores especiales: + - Infinito y NaN (No es un número) para indicar la falla. Así que volvemos a los números pares otra vez (254 para ambos lados, entero y fraccionario) pero con un sesgo menor.

La segunda razón es el desbordamiento gradual. El Estándar declara que normalmente todos los números están normalizados, lo que significa que el exponente indica la posición del primer bit. Para aumentar el número de bits, el primer bit normalmente no se establece pero se supone (bit oculto): El primer bit después del bit del exponente es el segundo bit del número, el primero es siempre un 1 binario. Si aplica la normalización se encuentra con el problema de que no puede codificar cero e incluso si codifica cero como valor especial, la exactitud numérica se ve obstaculizada. + -Infinito (el máximo exponente) deja en claro que algo anda mal, pero el flujo inferior a cero para números demasiado pequeños es perfectamente normal y, por lo tanto, es fácil pasar por alto como un posible problema. Entonces Kahan, el diseñador de la norma, decidió que los números desnormalizados o subnormales deberían ser introducidos y deberían incluir 1/MAX_FLOAT.

EDIT: Allan preguntó por qué la "precisión numérica se ve obstaculizada" si codifica cero como valor especial. Mejor debería decirlo ya que "la precisión numérica es todavía obstaculizada". De hecho, esta fue la implementación del histórico formato de coma flotante DEC VAX. Si el campo de exponente en la codificación de bits sin formato era 0, se consideró cero. Por ejemplo, tomo ahora el formato de 32 bits todavía desenfrenado en las GPU.

X 00000000 XXXXXXXXXXXXXXXXXXXXXXX 

En este caso, el contenido del campo mantisa a la derecha podría ser completamente ignorado y, normalmente, se llena de ceros. El campo de signo en el lado izquierdo podría ser válido, distinguiendo un cero normal y un "cero negativo" (Podría obtener un cero negativo por algo como -1.0/0.0 o redondear un número negativo).

El subdesbordamiento gradual y los subnormales de IEEE 754 en contraste usaban el campo mantisa. Solo

X 00000000 00000000000000000000000 

es cero. Todas las otras combinaciones de bits son válidas e incluso más prácticas, se le advierte si su resultado se desborda. Entonces, ¿cuál es el punto?

considerar los diferentes números de

A 0 00000009 10010101111001111111111 
B 0 00000009 10010101111100001010000 

Son miembros de coma flotante válidos, muy pequeñas, pero todavía finitos. Pero como puede ver, los primeros 11 bits son idénticos. Si resta ahora A-B o B-A, el primer bit válido abandona el rango exponencial inferior, por lo que el resultado sin subdesbordamiento gradual es .... 0. Entonces A! = B pero A-B = 0. Ouch. Innumerables personas han caído en esta trampa y se puede suponer que nunca la reconocieron. Lo mismo con la multiplicación o división: Necesita sumar o restar exponentes y si está por debajo del umbral inferior: 0. Y como sabe: 0 * todo = 0. Puede tener S T X Y Z y una vez un subproducto es 0, el resultado es 0 incluso cuando un número completamente válido e incluso enorme es el resultado correcto. Debería decirse que estas anomalías nunca podrían evitarse por completo debido al redondeo, pero con un flujo inferior gradual se volvieron raras. Muy raro.

+1

Me pregunto cómo la eficiencia del hardware de manejar denormalles se compara con la eficiencia del hardware de tener el siguiente número más grande después de que 1.00B-127 sea 1.00B-126, luego 1.10B-126, luego 1.00B-125, 1.01B-125 , etc. En otras palabras, redondee cada número al 1.00B-127 más cercano. Eso evitaría el raro comportamiento de subdesbordamiento que uno normalmente obtendría sin denormales, a pesar de que no proporcionaría el beneficio de su alcance adicional. Supongo que el rango no es tan importante como asegurar que (a-b) sea cero solo si (a == b), por lo que si el redondeo fuera más barato que los denormales, podría ser una ganancia. – supercat

+0

Extraño cómo los argumentos se repiten en el tiempo. De hecho, durante la invención de la estandarización IEEE 754 hubo una batalla entre Kahan (uso de subnormales) y el formato DEC VAX que funciona casi exactamente como el IEEE 754, pero usa solo cero. –

+0

Permitir que existan dos números cuya diferencia es demasiado pequeña para representar es un problema que algunas implementaciones eligen ignorar. ¿El formato VAX resolvió el problema o lo ignoró? Mi pensamiento sería que el problema no debería ser ignorado, pero los subnormales no son la mejor solución. Para los casos en que las multiplicaciones o divisiones se resolverían en cero, me gustaría ver valores "infinitosísimos" positivos y negativos, mientras que las adiciones o restas que producen cero deberían dar como resultado cero sin signo. Nunca va a suceder, pero eliminaría algunas de las asimetrías que rodean a los ceros. – supercat

Cuestiones relacionadas