Números desnormalizados ( ing. números desnormalizados ) o números subnormales [1] ( ing. números subnormales ): un tipo de números de coma flotante , definidos en el estándar IEEE 754 .
Los números están codificados : la mantisa comienza en 0, no en 1 (sin uno implícito ), y el orden es el más pequeño posible. Los números desnormalizados están más cerca de 0 que el número normalizado representable más pequeño. La máquina 0 también es un número desnormalizado.
Al escribir en formato float (precisión simple) , doble (precisión doble) , se escribirá 0 en el campo de orden.
El doble de 10 bytes de longitud (precisión extendida) no tiene números desnormalizados como una clase especial, ya que tiene un bit de parte entera explícito. Sin embargo, los números con el orden más pequeño (en el campo de orden 0) y el bit de la parte entera 0 tienen propiedades similares.
Para ahorrar memoria, se usa la llamada unidad implícita : los números en forma estándar binaria se escriben como 1,mmm 2 ·2 k , y la unidad principal no se conserva. En este formato, es imposible escribir cero; por lo tanto, el cero de la máquina será necesariamente algún número especial. Por comodidad, debe tener un pedido mínimo.
El hecho de que estos números especiales no sean solo ceros, sino 0,mmm 2 −126 (en un flotante de 4 bytes ) tiene un beneficio adicional: la suma y la resta no conducirán al desbordamiento (poner a cero el resultado) si el resultado de la operación no es un 0 exacto En otras palabras, gracias a la introducción de números desnormalizados, las condiciones y son equivalentes, sin importar cuán cerca (en la mantisa) y pequeños (en el orden ) sean los números que restamos. Sin la introducción de números desnormalizados, el resultado de tal operación podría ser 0, incluso si los números no son iguales. Lo mismo se aplica a la suma de números que son cercanos en valor absoluto, pero de diferente signo. Esto puede ser indeseable, como causar un error de división por cero si el resultado se usa como divisor [2] .
Por el contrario, en la calculadora MK-61 , restar 1,8 10 -99 - 1,2 10 -99 dará cero, aunque los números no son iguales.
Alguno[ ¿Qué? ] Los procesadores y coprocesadores matemáticos trabajan con números desnormalizados en hardware a la misma velocidad que con números normalizados. En otros, dicho procesamiento de hardware no se implementa (por ejemplo, para evitar complicar la implementación de la FPU), y los valores pequeños se llevan a cero inmediatamente (ver antidesbordamiento ) o se procesan en el sistema operativo en software La segunda opción conduce a un aumento en el tiempo de procesamiento de los números desnormalizados.
Los números desnormalizados se implementaron en el coprocesador matemático Intel 8087 en un momento en que el estándar IEEE 754 estaba en proceso de escritura. Eran la característica más controvertida de la aplicación propuesta, que finalmente se aceptó [3] , pero esta implementación demostró que los números desnormalizados podían manejarse en la práctica en el hardware. Algunas implementaciones de módulos de coma flotante no admiten números desnormalizados en hardware, sino que los procesan en software. Aunque este procesamiento es transparente para el usuario, puede hacer que los cálculos que generan o reciben números no normalizados como entrada tomen mucho más tiempo que los mismos cálculos con números normalizados.
Un ejemplo de un sistema en el que el formato de representación de números no incluía números desnormalizados es el ZX Spectrum .
La razón por la que se introdujeron números desnormalizados es parte de un problema computacional más general de encontrar la suma de números utilizando una precisión limitada (ver, por ejemplo, el algoritmo de Kahan ). Además, el problema resuelto por la introducción de números desnormalizados surge en un rango de números relativamente estrecho, cerca del límite de subdesbordamiento . Pero un problema similar también puede estar asociado con el desbordamiento: por ejemplo, si queremos comparar dos números con signos diferentes, cuyo orden es máximo, entonces la condición se probará con éxito y dará un resultado negativo, y la condición puede conducir a un error de desbordamiento. Así, en el caso general, los números desnormalizados no resuelven el problema del resultado en función de la permutación de términos, y aún se requiere cierta precisión por parte del programador cuando se trabaja con aritmética flotante. En caso de que el programador tenga que trabajar con números al borde del desbordamiento , parece más apropiado cambiar a un formato con una gama más amplia de exponentes , o usar medidas especiales para controlar la magnitud del exponente , que depender de números desnormalizados. Además, debe recordar que los números desnormalizados tienen menos dígitos significativos de la mantisa en comparación con los habituales para este formato, y esto conlleva una pérdida significativa de precisión.