stringtranslate.com

Aritmética de saturación

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 máximo.

Si el resultado de una operación es mayor que el máximo, se fija (" fija ") al máximo; si está por debajo del mínimo, se fija al mínimo. El nombre proviene de cómo el valor se "satura" una vez que alcanza los valores extremos; más sumas a un máximo o restas 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:

Aquí hay otro ejemplo para saturar la resta cuando el rango válido es de 0 a 100:

Como puede verse 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 y algoritmos digitales donde los valores tienen rangos máximos y mínimos representables.

uso moderno

Normalmente, los microprocesadores de uso general no implementan operaciones aritméticas de números enteros utilizando 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 " se ajustan " al valor mínimo, como las horas en un reloj que pasan de 12 a 1. En hardware, la aritmética modular con un mínimo de cero y un máximo de r n − 1, donde r es la base , se pueden implementar simplemente descartando todos los n dígitos excepto los más bajos. Para el hardware binario, que es la gran mayoría del hardware moderno, la base 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 numéricamente lo más cercano posible a la respuesta verdadera; para la aritmética binaria con signos de 8 bits, cuando la respuesta correcta es 130, es considerablemente menos sorprendente obtener una respuesta de 127 de la aritmética saturada que obtener una respuesta de −126 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 saturada que obtener una respuesta de 2 a partir de la aritmética modular.

La aritmética de saturación también permite detectar consistentemente el desbordamiento de sumas y multiplicaciones sin un bit de desbordamiento o un cálculo excesivo, simplemente por comparación con el valor máximo o mínimo (siempre que el dato no pueda tomar 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 provocar un desbordamiento y la saturación provoca una distorsión significativamente menor en el sonido que el sonido envolvente. En palabras de los investigadores GA Constantinides et al.: [1]

Al sumar dos números utilizando la representación en complemento a dos, el desbordamiento produce un fenómeno de "envoltura". 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 generalmente se escalan adecuadamente para evitar el desbordamiento de todos los vectores de entrada, excepto los más extremos, o se producen utilizando componentes aritméticos de saturación.

Implementaciones

Las operaciones aritméticas de saturación están disponibles en muchas plataformas modernas y, en particular, fue 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 . 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 de manera eficiente en software en una máquina con solo operaciones aritméticas modulares, ya que las implementaciones simples requieren ramificaciones que crean enormes retrasos en el proceso. Sin embargo, es posible implementar sumas y restas saturadas en software sin ramas , utilizando solo operaciones aritméticas modulares y lógicas bit a bit que están disponibles en todas las CPU modernas y sus predecesoras, incluidas todas las CPU x86 (hasta el Intel 8086 original ) y algunas populares. CPU de 8 bits (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 requiere múltiples ciclos de reloj. En x86, que proporciona indicadores de desbordamiento y movimientos condicionales , es posible un código muy simple sin ramificaciones. [3]

Aunque la aritmética de saturación es menos popular para la aritmética de 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 sobre este resultado continúa produciendo el mismo valor. Esto tiene la ventaja sobre la saturación simple de que las operaciones posteriores que disminuyen 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 insuficiente de exponente") que persistirán de manera similar a través de operaciones posteriores, o causarán una terminación inmediata, o se probarán como en FORTRAN para IBM704 (octubre de 1956).IF ACCUMULATOR OVERFLOW ...

Ver también

Notas

  1. ^ De hecho, la aritmética de no saturación también puede sufrir fallas de asociatividad y distributividad en entornos de precisión limitada, pero dichas fallas tienden a ser menos obvias.

Referencias

  1. ^ GA Constantinides, PYK Cheung y W. Luk. Síntesis de Arquitecturas Aritméticas de Saturación .
  2. ^ "Partes internas de la colección de compiladores GNU (GCC): aritmética". Documentación del CCG .Incorporaciones del lado del lenguaje
  3. ^ "Aritmética de saturación sin ramificaciones". locklessinc.com . Archivado desde el original el 13 de febrero de 2019.

enlaces externos