Operadores aritméticos en expresiones
Si se utilizan operadores aritméticos, el resultado de la expresión es un número derivado de la aplicación de los operadores a los valores de los operandos.
El resultado de la expresión puede ser nulo. Si algún operando tiene el valor nulo, el resultado de la
expresión es el valor nulo. Los operadores aritméticos (excepto el más unario, que no tiene sentido) no deben aplicarse a las cadenas. Por ejemplo, USER+2 no es válido. Los operadores de multiplicación y división no deben aplicarse a valores de fecha y hora, que solo pueden sumarse y restarse.
El operador de prefijo + (más unario ) no cambia su operando. El operador de prefijo - (menos unario ) invierte el signo de un operando de punto flotante no decimal y distinto de cero. El operador de prefijo - (menos unario ) invierte el signo de todos los operandos decimales de punto flotante, incluidos el cero y los valores especiales; es decir, el signo y el no signo NaNs y más y menos infinito. Si el tipo de datos de A es un entero pequeño, el tipo de datos de -A es un entero grande. El primer carácter del símbolo que sigue a un operador de prefijo no debe
ser un signo más ni un signo menos.
Los operadores infijos especifican la suma (+), la resta (-), la multiplicación (*) y la división (/). El valor del segundo operando de la división no debe ser cero.
Aritmética con dos operandos enteros
Si ambos operandos de un operador aritmético son números enteros, la operación se realiza en binario. El resultado es un número entero grande a menos que uno (o ambos) de los operandos sea un número entero grande, en cuyo caso el resultado es un número entero grande.
El resultado de una operación aritmética de enteros (incluyendo el menos unario) debe estar dentro del rango del tipo del resultado.
Aritmética con un operando de entero y decimal
Si un operando es un entero y el otro operando es decimal, la operación se realiza en decimales. La operación aritmética utiliza una copia temporal del entero que se ha convertido en un número decimal.
La copia temporal del número entero que se ha convertido en un número decimal tiene una precisión p y una escala 0. p es 19 para un número entero grande, 11 para un número entero grande y 5 para un número entero pequeño. En el caso de una constante entera, p depende del número de dígitos de la constante entera. p es 5 para una constante entera que consta de 5 dígitos o menos. De lo contrario, p es igual al número de dígitos de la constante entera.
Aritmética con un entero y un operando de punto flotante decimal
Si un operando es un número entero pequeño, un número entero grande o un número entero muy grande y el otro es un número decimal de coma flotante, la operación se realiza en coma flotante decimal. La operación aritmética utiliza una copia temporal del número entero que se ha convertido en un número decimal de coma flotante.
Para enteros pequeños o enteros grandes, la copia temporal del entero se convierte a DECFLOAT(16). Para números enteros grandes, la copia temporal del número entero grande se convierte a DECFLOAT(34). A continuación, se aplican las reglas para operandos de punto flotante de dos decimales.
Aritmética con dos operandos decimales
Si los dos operandos son decimales, la operación se efectúa en decimal.
- La precisión y la escala de los operandos
- En la discusión de operaciones con dos operandos decimales, la precisión y la escala del primer operando se denotan por p y s, la del segundo operando por p' y s'. Así, para una división, el dividendo tiene precisión p y escala s, y el divisor tiene precisión p' y escala s '.
- Si DEC31 o DEC15 está en vigor para la operación
- DEC31 y DEC15 especifican las reglas que se deben utilizar cuando ambos operandos en una operación decimal tienen precisiones de 15 o menos. DEC15 DEC31 especifica las reglas que no permiten una precisión superior a 15 dígitos, y especifica las reglas que permiten una precisión de hasta 31 dígitos. Las reglas para DEC31 se utilizan siempre si cualquiera de los operandos tiene una precisión superior a 15.
Para las sentencias SQL estáticas, el valor del campo DECIMAL ARITHMETIC en el panel de instalación DSNTIP4 o la opción de procesamiento SQL DEC determina si se utiliza DEC15 o DEC31.
Para las sentencias SQL dinámicas, el valor del campo DECIMAL ARITHMETIC en el panel de instalación DSNTIP4, la opción de procesamiento SQL DEC o el registro especial CURRENT PRECISION determina si se utiliza DEC15 o DEC31 de acuerdo con estas reglas:
- El campo DECIMAL ARITHMETIC se aplica si se cumple alguna de estas condiciones:
- Se aplica el comportamiento de ejecución DYNAMICRULES y la aplicación no ha establecido CURRENT PRECISION.
Para obtener una lista de los valores de la opción DYNAMICRULES que especifican ejecutar, vincular, definir o invocar un comportamiento, consulte la Tabla 1.
- Se aplican las REGLAS DINÁMICAS que vinculan, definen o invocan el comportamiento; el valor del campo USE FOR DYNAMICRULES (USO PARA REGLAS DINÁMICAS) del panel de instalación es YES (SÍ); y la aplicación no ha establecido CURRENT PRECISION (PRECISIÓN ACTUAL).
- Se aplica el comportamiento de ejecución DYNAMICRULES y la aplicación no ha establecido CURRENT PRECISION.
- La opción de procesamiento SQL DEC se aplica si el comportamiento de enlace, definición o invocación de REGLAS DINÁMICAS está en vigor, el valor del campo USE FOR DYNAMICRULES del panel de instalación es NO y la aplicación no ha establecido CURRENT PRECISION.
- El registro especial CURRENT PRECISION se aplica si la aplicación establece el registro.
El valor de ARITMÉTICA DECIMAL es el valor predeterminado para la opción de procesamiento SQL y el registro especial. Las sentencias SQL ejecutadas con SPUFI utilizan el valor en DECIMAL ARITHMETIC.
Suma y resta de decimales
Para las operaciones decimales, la precisión y la escala del resultado dependen de la precisión y la escala de los operandos.
Si la operación es de suma o resta y los operandos no tienen la misma escala, la operación se realiza con una copia temporal de uno de los operandos que se ha ampliado con ceros a la izquierda para que su parte fraccionaria tenga el mismo número de dígitos que el otro operando.
La precisión del resultado es el mínimo de n y la cantidad MAX(p-s,p'-s')+MAX(s,s')+1. La escala es de un MAX(s,s'). n es 31 si DEC31 está en vigor o si la precisión de al menos un operando es superior a 15. De lo contrario, n es 15.
En COBOL, los espacios en blanco deben preceder y seguir a un signo menos para evitar cualquier ambigüedad con los nombres de variables de host COBOL (que permiten el uso de un guión).
Multiplicación decimal
Para la multiplicación decimal, la precisión y escala del resultado dependen de la precisión y escala de los operandos.
Para la multiplicación, la precisión del resultado es de un MIN(n,p+p'), y la escala es de un MIN(n,s+s'). n es 31 si DEC31 está en vigor o si la precisión de al menos un operando es superior a 15. De lo contrario, n es 15.
Si ambos operandos tienen una precisión superior a 15, la operación se realiza utilizando una copia temporal del operando con la precisión más pequeña. Si los operandos tienen la misma precisión, se selecciona el segundo operando. Si se necesitan más de 15 dígitos significativos para la parte integral de la copia, la ejecución del extracto finaliza y se produce un error. De lo contrario, la copia se convierte en un número con precisión 15, truncando la copia de la derecha. La copia truncada tiene una escala de MAX(0,S-(P-15)), donde P y S son la precisión y la escala originales. Si, en el proceso de truncamiento, se eliminan uno o más dígitos distintos de cero, SQLWARN7 en SQLCA se establece en W, lo que indica pérdida de precisión.
Cuando ambos operandos tienen una precisión superior a 15, las fórmulas anteriores para la precisión y la escala del resultado siguen siendo aplicables, con un cambio: para el operando seleccionado como copia, utilice la precisión y la escala de la copia truncada; es decir, utilice 15 como precisión y MAX(0,S-(P-15)) como escala.
10000000000000000000000000. * 1causará desbordamiento porque el número de ceros iniciales en la representación de 31 dígitos del número grande y la precisión del número pequeño son ambos 5. Ver Aritmética con un entero y un operando decimal.Aritmética con un operando de entero y decimal
Si un operando es un entero y el otro operando es decimal, la operación se realiza en decimales. La operación aritmética utiliza una copia temporal del entero que se ha convertido en un número decimal.
La copia temporal del número entero que se ha convertido en un número decimal tiene una precisión p y una escala 0. p es 19 para un número entero grande, 11 para un número entero grande y 5 para un número entero pequeño. En el caso de una constante entera, p depende del número de dígitos de la constante entera. p es 5 para una constante entera que consta de 5 dígitos o menos. De lo contrario, p es igual al número de dígitos de la constante entera.
División decimal
Las reglas para una división decimal específica dependen de si la opción de e DEC31 o está en vigor para la operación, si p es mayor que 15 y si p' es mayor que 15.
La siguiente tabla muestra cómo la precisión y la escala del resultado dependen de estos factores. En esa tabla, la aparición de N/A
en una fila implica que el factor indicado no es relevante para el caso representado por la fila.
| DEC31 | p | p' | C | S |
|---|---|---|---|---|
| No en vigor | ≤15 | ≤15 | 15 | 15-(p-s+s') |
| Vigente | ≤15 | ≤15 | 31 | N-(p-s+s'), donde
|
| N/D | >15 | ≤15 | 31 | N-(p-s+s'), donde
|
| N/D | N/D | >15 | 31 | 15-(p-s+x), dondex es MAX(0,s'-(p'-15))(Ver la siguiente nota) |
Si p' es mayor que 15, la división se realiza utilizando una copia temporal del divisor. Si se necesitan más de 15 dígitos significativos para la parte integral del divisor, la ejecución del estado de cuenta finaliza y se produce un error. De lo contrario, la copia se convierte en un número con precisión 15, truncando la copia de la derecha. La copia truncada tiene una escala de MAX(0,s'-(p'-15)), que es la fórmula para x. Si, en el proceso de truncamiento, se eliminan uno o más dígitos distintos de cero, SQLWARN7 en SQLCA se establece en W, lo que indica pérdida de precisión.
- División mínima de la escala de resultados
- Si el valor calculado de «s » es negativo, se produce un error. Si se especifica una escala de resultados de división mínima, este error no se produce.
La escala mínima se determina de acuerdo con la siguiente prioridad:
- SQL estático
- La opción DEC del precompilador, si se establece con una escala distinta de cero.
- El parámetro del subsistema DECARTH, si se establece con una escala distinta de cero.
- El parámetro del subsistema MINDVSCL, si se establece en un valor distinto de NONE.
- El parámetro del subsistema DECDIV3, si está establecido en YES.
- SQL dinámico
- El registro especial CURRENT PRECISION, si está configurado con una escala distinta de cero.
- Cualquiera de los siguientes casos:
- Para un paquete que se enlazó con DYNAMICRULES RUN o si el valor DYNRULS DECP se establece en YES: El parámetro del subsistema DECARTH, si se establece con una escala distinta de cero.
- Para todos los demás casos: La opción DEC del precompilador, si se establece con una escala distinta de cero.
- El parámetro del subsistema MINDVSCL, si se establece en un valor distinto de NONE.
- El parámetro del subsistema DECDIV3, si está establecido en YES.
- Instrucciones SQL que se ejecutan utilizando SPUFI
- El valor del parámetro del subsistema DECARTH.
El valor predeterminado tanto para la opción DEC del precompilador como para el registro especial CURRENT PRECISION es ARITMÉTICA DECIMAL.
Se puede especificar una escala de resultado de división mínima de 3 utilizando la configuración del parámetro del subsistema de la interfaz de programación de aplicaciones ( DECDIV3 ). Se puede especificar un resultado de escala de división mínima en el rango 1–9 utilizando el valor del parámetro del subsistema DECARTH con el formato 'D pp. s ' donde ' pp ' es 15 o 31 y representa la precisión y ' s ' representa la escala de división mínima, como un número en el rango 1–9. Dicha especificación anula el parámetro del subsistema de DECDIV3. Cuando se especifica una escala de resultado de división mínima, se aplica la fórmula
MAX(s,s'), donde s representa la escala derivada de la tabla anterior y s' representa el valor especificado por la escala de resultado de división mínima, y se deriva una nueva escala. La escala recién derivada es la escala del resultado y anula cualquier escala derivada utilizando la tabla anterior.
Para obtener más información, consulte:
Aritmética con operandos de punto flotante
Si cualquiera de los operandos de un operador aritmético es de punto flotante, la operación se realiza en punto flotante. Si es necesario, los operandos se convierten primero en números de punto flotante de doble precisión. Por lo tanto, si cualquier elemento de una expresión es un número de coma flotante, el resultado de la expresión es un número de coma flotante de precisión doble.
Una operación que implica un número de punto flotante y un número entero se realiza con una copia temporal del número entero que se ha convertido a punto flotante de doble precisión. Una operación que implica un número de punto flotante y un número decimal se realiza con una copia temporal del número decimal que se ha convertido a punto flotante de doble precisión. El resultado de una operación de coma flotante debe estar dentro del rango de los números de coma flotante.
El orden en el que se procesan los operandos de punto flotante (o argumentos de funciones) puede afectar ligeramente a los resultados porque los operandos de punto flotante son representaciones aproximadas de números reales. Debido a que el orden en el que se procesan los operandos puede ser modificado implícitamente por el lenguaje de consulta ( Db2 ) (por ejemplo, el lenguaje de consulta ( Db2 ) puede decidir qué grado de paralelismo utilizar y qué plan de acceso utilizar), una aplicación que utilice operandos de punto flotante no debe depender de que los resultados sean exactamente los mismos cada vez que se ejecute una instrucción SQL.
Aritmética con un operando de coma flotante y un operando de coma flotante decimal
Si un operando es un número de coma flotante (real o doble) y el otro es un número decimal de coma flotante, la operación se realiza en coma flotante decimal. La operación aritmética utiliza una copia temporal del número de coma flotante que se ha convertido en un número de coma flotante decimal.
Aritmética con dos operandos decimales de punto flotante
Si ambos operandos son decimales de punto flotante, la operación se realiza en decimales de punto flotante. Si un operando es DECFLOAT( n ) y el otro es DECFLOAT( m ), la operación se realiza en DECFLOAT(max( n, m )).
Reglas generales de operaciones aritméticas para DECFLOAT
Las siguientes reglas generales se aplican a todas las operaciones aritméticas en el tipo de datos DECFLOAT:
- Cada operación con números finitos se lleva a cabo como si se calculara un resultado matemático exacto, utilizando aritmética de números enteros en el coeficiente siempre que sea posible.
Si el coeficiente del resultado exacto teórico no tiene más dígitos que el que refleja su precisión (16 ó 34), éste se utilizará para el resultado sin cambios (a menos que haya una condición de desbordamiento o subdesbordamiento). Si el coeficiente tiene más dígitos que el que refleja su precisión, éste se redondeará a exactamente el número de dígitos que refleje su precisión (16 ó 34) y el exponente aumentará en el número de dígitos eliminados.
Para instrucciones SQL estáticas distintas de CREATE VIEW, la opción de enlace ROUNDING o la opción de procedimiento SQL nativo determina el modo de redondeo.
Para las sentencias SQL dinámicas (y las sentencias CREATE VIEW estáticas), el registro especial CURRENT DECFLOAT ROUNDING MODE determina el modo de redondeo.
Si el valor del exponente ajustado del resultado es menor que Emin, se devuelve una condición de excepción. En este caso, el coeficiente calculado y el exponente forman el resultado, a menos que el valor del exponente sea menor que Etiny, en cuyo caso el exponente se establece en Etiny, el coeficiente se redondea (posiblemente a cero) para que coincida con el ajuste del exponente, y el signo no se modifica. Si este redondeo proporciona un resultado inexacto, se devolverá una condición de excepción de subdesbordamiento.
Si el valor del exponente ajustado del resultado es superior a Emax, se devolverá una condición de excepción de desbordamiento. En este caso, el resultado se define como una condición de excepción de desbordamiento y podría ser infinito. Tendrá el mismo signo que el resultado teórico.
- La aritmética que utiliza el valor especial de infinito sigue las normas habituales, en las que infinito negativo es inferior a todos los números finitos e infinito positivo es superior a todos los números finitos.
Basándose en dichas normas, un resultado infinito es siempre exacto. Ciertos usos de infinito devuelven una condición de operación no válida. La siguiente lista es una lista de operaciones que pueden causar una condición de operación no válida y el resultado de la operación es NaN cuando uno de los operandos es infinito pero el otro operando no lo es NaN ni sNaN.
- Sumar +infinity a -infinity durante una operación de sumar o restar
- Multiplicar 0 por +infinito o -infinito
- Dividir +infinito o -infinito por +infinito o -infinito
El primer argumento de la función MOD es +infinito o -infinito
- Cualquiera de los dos argumentos de la función QUANTIZE es +infinito o -infinito
- El segundo argumento de la función POWER® es +infinito o -infinito
NaN, cuando se utiliza como operando en una operación aritmética
Las siguientes reglas aritméticas se aplican a las operaciones aritméticas y al valor e NaN :
El resultado de cualquier operación aritmética que tenga un operando que sea un NaN (un NaN silencioso o un NaN de señalización) es NaN. El signo del resultado se copia del primer operando que es un operando de señalización ( NaN, ) o, si ninguno de los operandos es de señalización, el signo se copia del primer operando que es un operando de retención ( NaN ). Cada vez que un resultado sea un NaN, el signo del resultado dependerá sólo del operando copiado.
- El signo del resultado de una multiplicación o división será negativo solo si los operandos tienen signos diferentes y ninguno es un e NaN.
- El signo del resultado de una suma o resta será negativo solo si el resultado es menor que cero y ninguno de los operandos es un e NaN, o, excepto en los siguientes casos en los que el resultado es un 0 negativo:
- Un resultado se redondea a cero y el valor, antes del redondeo, tenía un signo negativo
- Restar 0 de -0
- Si se suman operandos con signos opuestos (o se restan operandos con el mismo signo), el resultado tiene un coeficiente de 0 y el modo de redondeo es ROUND_FLOOR
- Multiplicación o división y el resultado tiene un coeficiente de 0 y los signos de los operandos son diferentes
- El primer argumento de la función POWER es -0 y el segundo argumento es un número impar positivo
- El argumento de la función CEIL, FLOOR o SQRT es -0
- El primer argumento de la función ROUND o TRUNCATE es -0

INFINITY + 1 = INFINITY
INFINITY + INFINITY = INFINITY
INFINITY + -INFINITY = NAN -- exception
NAN + 1 = NAN
NAN + INFINITY = NAN
1 - INFINITY = -INFINITY
INFINITY - INFINITY = NAN -- exception
-INFINITY - -INFINITY = NAN -- exception
-0.0 - 0.0E1 = -0.0
-1.0 * 0.0E1 = -0.0
1.0E1 / 0 = INFINITY
-1.0E5 / 0.0 = -INFINITY
1.0E5 / -0 = -INFINITY
INFINITY / -INFINITY = NAN -- exception
INFINITY / 0 = INFINITY
-INFINITY / 0 = -INFINITY
-INFINITY / -0 = INFINITY
Aritmética con operandos de tipos distintos
Un tipo distinto no puede utilizarse con operadores aritméticos, incluso si su tipo de datos de origen es numérico. Para llevar a cabo una operación aritmética, cree una función con el operador aritmético como fuente. Por ejemplo, si hubiera tipos distintos de INGRESOS y GASTOS, ambos con tipos de datos DECIMAL(8,2), se podría utilizar la siguiente función definida por el usuario, INGRESOS, para restar uno de otro.
CREATE FUNCTION REVENUE ( INCOME, EXPENSES )
RETURNS DECIMAL(8,2) SOURCE "-" ( DECIMAL, DECIMAL)
De forma alternativa, el operador - (menos) podría sobrecargarse utilizando una función para restar los nuevos tipos de datos.
CREATE FUNCTION "-" ( INCOME, EXPENSES )
RETURNS DECIMAL(8,2) SOURCE "-" ( DECIMAL, DECIMAL)
De forma alternativa, el tipo distinto puede ser convertido a un tipo de datos incorporado y el resultado utilizado como operando de un operador aritmético.