La aritmética de saturación es una versión de la aritmética en la que todas las operaciones, como la suma y la multiplicación , están limitadas a un rango fijo entre un valor mínimo y un valor máximo.
Si el resultado de una operación es mayor que el máximo, se fija (" se fija ") al máximo; si es menor que el mínimo, se fija al mínimo. El nombre proviene de cómo el valor se "satura" una vez que alcanza los valores extremos; las adiciones posteriores a un máximo o las sustracciones de un mínimo no cambiarán el resultado.
Por ejemplo, si el rango válido de valores es de −100 a 100, las siguientes operaciones aritméticas de saturación producen los siguientes valores:
A continuación se muestra otro ejemplo de resta saturada cuando el rango válido es de 0 a 100:
Como se puede ver en estos ejemplos, propiedades familiares como la asociatividad y la distributividad pueden fallar en la aritmética de saturación. [a] Esto hace que sea desagradable tratarlo en matemáticas abstractas , pero tiene un papel importante que desempeñar en hardware digital y algoritmos donde los valores tienen rangos máximos y mínimos representables.
Por lo general, los microprocesadores de propósito general no implementan operaciones aritméticas de números enteros mediante aritmética de saturación; en su lugar, utilizan la aritmética modular , más fácil de implementar , en la que los valores que exceden el valor máximo " retornan " al valor mínimo, como las horas en un reloj que pasan de las 12 a la 1. En hardware, la aritmética modular con un mínimo de cero y un máximo de r n − 1, donde r es el radix , se puede implementar simplemente descartando todos los dígitos excepto los n más bajos . Para el hardware binario, que es la gran mayoría del hardware moderno, el radix es 2 y los dígitos son bits.
Sin embargo, aunque es más difícil de implementar, la aritmética de saturación tiene numerosas ventajas prácticas. El resultado es lo más cercano numéricamente posible a la respuesta verdadera; para la aritmética binaria con signo de 8 bits, cuando la respuesta correcta es 130, es considerablemente menos sorprendente obtener una respuesta de 127 a partir de la aritmética de saturación que obtener una respuesta de −126 a partir de la aritmética modular. Del mismo modo, para la aritmética binaria sin signo de 8 bits, cuando la respuesta correcta es 258, es menos sorprendente obtener una respuesta de 255 a partir de la aritmética de saturación que obtener una respuesta de 2 a partir de la aritmética modular.
La aritmética de saturación también permite detectar desbordamientos de sumas y multiplicaciones de manera consistente sin un bit de desbordamiento o un cálculo excesivo, mediante una simple comparación con el valor máximo o mínimo (siempre que no se permita que el dato adopte estos valores).
Además, la aritmética de saturación permite algoritmos eficientes para muchos problemas, particularmente en el procesamiento de señales digitales . Por ejemplo, ajustar el nivel de volumen de una señal de sonido puede resultar en un desbordamiento, y la saturación causa una distorsión significativamente menor en el sonido que el envolvente. En palabras de los investigadores GA Constantinides et al.: [1]
Al sumar dos números mediante la representación del complemento a dos, el desbordamiento produce un fenómeno de "envolvimiento". El resultado puede ser una pérdida catastrófica en la relación señal/ruido en un sistema DSP. Por lo tanto, las señales en los diseños DSP suelen escalarse adecuadamente para evitar el desbordamiento en todos los vectores de entrada, excepto los más extremos, o se producen utilizando componentes aritméticos de saturación.
Las operaciones aritméticas de saturación están disponibles en muchas plataformas modernas y, en particular, fueron una de las extensiones realizadas por la plataforma Intel MMX , específicamente para este tipo de aplicaciones de procesamiento de señales. Esta funcionalidad también está disponible en versiones más amplias en los conjuntos de instrucciones de números enteros SSE2 y AVX2 . También está disponible en el conjunto de instrucciones ARM NEON .
La aritmética de saturación para números enteros también se ha implementado en software para varios lenguajes de programación, incluidos C , C++ , como GNU Compiler Collection , [2] LLVM IR y Eiffel . El soporte para la aritmética de saturación se incluye como parte de la biblioteca estándar de C++26 . Esto ayuda a los programadores a anticipar y comprender mejor los efectos del desbordamiento y, en el caso de los compiladores, generalmente eligen la solución óptima.
La saturación es un desafío para implementar eficientemente en software en una máquina con solo operaciones aritméticas modulares, ya que las implementaciones simples requieren ramificaciones que crean enormes retrasos en la canalización. Sin embargo, es posible implementar la suma y resta saturadas en software sin ramificaciones , utilizando solo operaciones lógicas aritméticas modulares y bit a bit que están disponibles en todas las CPU modernas y sus predecesoras, incluidas todas las CPU x86 (desde el Intel 8086 original ) y algunas CPU de 8 bits populares (algunas de las cuales, como la Zilog Z80 , todavía están en producción). Por otro lado, en CPU simples de 8 y 16 bits, un algoritmo de ramificación podría ser más rápido si se programa en ensamblador, ya que no hay canalizaciones que se detengan y cada instrucción siempre toma múltiples ciclos de reloj. En el x86, que proporciona indicadores de desbordamiento y movimientos condicionales , es posible un código sin ramificaciones muy simple. [3]
Aunque la aritmética de saturación es menos popular para la aritmética de números enteros en hardware, el estándar de punto flotante IEEE , la abstracción más popular para tratar con números reales aproximados , utiliza una forma de saturación en la que el desbordamiento se convierte en "infinito" o "infinito negativo", y cualquier otra operación en este resultado continúa produciendo el mismo valor. Esto tiene la ventaja sobre la saturación simple de que las operaciones posteriores que disminuyan el valor no terminarán produciendo un resultado engañosamente "razonable", como en el cálculo . Alternativamente, puede haber estados especiales como "desbordamiento de exponente" (y "desbordamiento de exponente") que persistirán de manera similar a través de operaciones posteriores, o causarán la terminación inmediata, o se probarán como en FORTRAN para IBM 704 (octubre de 1956).IF ACCUMULATOR OVERFLOW ...