El término subdesbordamiento aritmético (también subdesbordamiento de punto flotante o simplemente subdesbordamiento ) es una condición en un programa de computadora donde el resultado de un cálculo es un número de valor absoluto más preciso que el que la computadora puede realmente representar en la memoria de su unidad central de procesamiento (CPU).
El desbordamiento aritmético puede ocurrir cuando el resultado verdadero de una operación de punto flotante es menor en magnitud (es decir, más cercano a cero) que el valor más pequeño representable como un número de punto flotante normal en el tipo de datos de destino . [1] El desbordamiento puede considerarse en parte como un desbordamiento negativo del exponente del valor de punto flotante. Por ejemplo, si la parte del exponente puede representar valores de −128 a 127, entonces un resultado con un valor menor que −128 puede causar un desbordamiento.
En el caso de los números enteros, el término "desbordamiento de entero" normalmente se refiere a un tipo especial de desbordamiento de entero o condición de envoltura de entero por la cual el resultado de la resta daría como resultado un valor menor que el mínimo permitido para un tipo de entero dado, es decir, el resultado ideal estaba más cerca del infinito negativo que el valor representable del tipo de salida más cercano al infinito negativo. [2] [3] [4] [5] [6]
El intervalo entre − cero y fminN , donde fminN es el valor de punto flotante normal positivo más pequeño, se denomina brecha de desbordamiento. Esto se debe a que el tamaño de este intervalo es muchos órdenes de magnitud mayor que la distancia entre valores de punto flotante normales adyacentes justo fuera de la brecha. Por ejemplo, si el tipo de datos de punto flotante puede representar 20 bits , la brecha de desbordamiento es 2 21 veces mayor que la distancia absoluta entre valores de punto flotante adyacentes justo fuera de la brecha. [7]
En los diseños más antiguos, el espacio libre de desbordamiento tenía un único valor utilizable: cero. Cuando se producía un desbordamiento, el resultado real se reemplazaba por cero (ya sea directamente por el hardware o por el software del sistema que manejaba la condición de desbordamiento primario). Este reemplazo se denomina "vaciado a cero".
La edición de 1984 de IEEE 754 introdujo los números subnormales . Los números subnormales (incluido el cero) llenan el espacio de desbordamiento con valores donde la distancia absoluta entre valores adyacentes es la misma que para los valores adyacentes justo fuera del espacio de desbordamiento. Esto permite el "desbordamiento gradual", donde se utiliza un valor subnormal más cercano, al igual que se utiliza un valor normal más cercano cuando es posible. Incluso cuando se utiliza un desbordamiento gradual, el valor más cercano puede ser cero. [8]
La distancia absoluta entre valores de punto flotante adyacentes justo fuera del espacio se llama épsilon de máquina , típicamente caracterizada por el valor más grande cuya suma con el valor 1 dará como resultado la respuesta con valor 1 en ese esquema de punto flotante. [9] Esto se puede escribir como , donde es una función que convierte el valor real en la representación de punto flotante. Si bien la épsilon de máquina no debe confundirse con el nivel de desbordamiento inferior (asumiendo números subnormales), está estrechamente relacionado. La épsilon de máquina depende de la cantidad de bits que componen el mantisa , mientras que el nivel de desbordamiento inferior depende de la cantidad de dígitos que componen el campo de exponente. En la mayoría de los sistemas de punto flotante, el nivel de desbordamiento inferior es menor que la épsilon de máquina.
La ocurrencia de un desbordamiento puede establecer un bit de estado ("pegajoso"), generar una excepción, generar una interrupción a nivel de hardware o puede causar alguna combinación de estos efectos.
Como se especifica en IEEE 754 , la condición de desbordamiento insuficiente solo se señala si también hay una pérdida de precisión. Normalmente, esto se determina como que el resultado final es inexacto. Sin embargo, si el usuario está realizando una trampa en caso de desbordamiento insuficiente, esto puede suceder independientemente de la consideración de la pérdida de precisión. El manejo predeterminado en IEEE 754 para el desbordamiento insuficiente (así como otras excepciones) es registrar como un estado de punto flotante que se ha producido un desbordamiento insuficiente. Esto se especifica para el nivel de programación de aplicaciones, pero a menudo también se interpreta como cómo manejarlo a nivel de hardware.