Una expresión numérica realiza un cálculo que usa constantes, campos, operadores y funciones numéricas para devolver un valor numérico. Cuando utilice una expresión numérica para asignar un valor a un campo, dicho campo deben tener un formato numérico. El formato predeterminado es D12.2.
Una expresión numérica puede contener los siguientes componentes, que aparecen abajo en rojo:
COMPUTE COUNT/I2 = 1 ;
COMPUTE COST/D12.2 = EXPN(8E+3);
Para obtener información acerca del uso de la sintaxis, vaya a Cómo Expresar un número en notación científica.
COMPUTE RECOUNT/I2 = COUNT ;
COMPUTE BONUS/D12.2 = CURR_SAL * 0.05 ;
Para obtener una lista de operadores numéricos, vaya a Operadores aritméticos.
COMPUTE LONGEST_SIDE/D12.2 = MAX (WIDTH, HEIGHT) ;
COMPUTE PROFIT/D12.2 = (RETAIL_PRICE - UNIT_COST) * UNIT_SOLD ;
Fíjese cómo se utiliza el paréntesis para cambiar el orden de evaluación de la expresión. Para obtener información acerca del orden en que se realizan las operaciones numéricas, vaya a Orden de evaluación.
Antes de utilizarlos para realizar cálculos, los valores numéricos se convierten por lo general en formato de punto flotante de doble precisión. Luego el resultado se convierte al formato del campo específico. En algunos casos, la conversión podría arrojar diferencias en el redondeo. Tenga en cuenta que los entornos que admiten aritmética de modo nativo manejan el redondeo de manera distinta. Para obtener información detallada, consulte Cómo evaluar expresiones numéricas con aritmética de modo nativo.
Si un número es demasiado grande (mayor de 1075) o demasiado pequeño(menor de 10-75), recibe una advertencia de exceso o de falta y aparece asteriscos en el lugar correspondiente al valor de campo.
Nota: Puede cambiar el carácter de desbordamiento emitiendo el comando SET OVERFLOWCHAR.
Para más información sobre el comportamiento de redondeo en formatos numéricos, consulte el manual Cómo describir datos con el lenguaje WebFOCUS .
En una cláusula IF, utilice la sintaxis siguiente:
IF field op n[.nn]{E|D|e|d}[+|-]p
En una cláusula WHERE, utilice la sintaxis siguiente:
WHERE field op EXPN(n[.nn{E|D|e|d}[+|-]p);
En un comando COMPUTE, utilice la sintaxis siguiente:
COMPUTE field[/format] = EXPN(n[.nn]{{E|D|e|d}[+|-]p);
En un comando DEFINE, utilice la sintaxis siguiente:
DEFINE FILE filename field[/format] = EXPN(n[.nn]{E|D|e|d}[+|-]p); END
En una DEFINE en el archivo máster, utilice la sintaxis siguiente:
DEFINE field[/format] = EXPN(n[.nn]{{E|D|e|d}[+|-]p);
donde:
Nota: EXPN es útil para cálculos en campos de formato F y D. Por lo general, no es útil para cálculos en campos de formato P o I.
Puede utilizar notación científica en una cláusula IF o WHERE para expresar 8000 como 8E+03:
IF RCOST LT 8E+03
WHERE RCOST LT EXPN(8E+03)
La siguiente lista muestra los operadores aritméticos que puede utiilizar en una expresión:
Adición |
+ |
Sustracción |
- |
Multiplicación |
* |
División |
/ |
Exponenciación |
** |
Nota: Si desea intentar dividir entre cero, el valor de la expresión es cero. Ningún tipo de expresión de fecha admiten la multiplicación ni la elevación a una potencia. Para aislar parte de una fecha, utilice un comando de asignación simple.
Las expresiones numéricas se evalúan en el orden que sigue:
Cuando los operadores están al mismo nivel, se evalúan de izquierda a derecha. Ya que las expresiones entre paréntesis se evalúan antes que cualquier otra expresión, puede utilizar paréntesis para cambiar este orden predefinido. Por ejemplo, las expresiones siguientes producen resultados diferentes debido al uso de paréntesis:
COMPUTE PROFIT/D12.2 = RETAIL_PRICE - UNIT_COST * UNIT_SOLD ; COMPUTE PROFIT/D12.2 = (RETAIL_PRICE - UNIT_COST) * UNIT_SOLD ;
En la primera expresión, UNIT_SOLD se multiplica primero por UNIT_COST y el resultado se resta de RETAIL_PRICE. En la segunda expresión primero se resta UNIT_COST de RETAIL_PRICE y el resultado se multiplica por UNIT_SOLD.
Nota: No pueden aparecer dos operadores de forma consecutiva. La siguiente expresión es incorrecta:
a * -1
Para que sea válida, añada paréntesis:
a* (-1)
El orden de evaluación puede afectar el resultado de una expresión. Digamos que desea determinar la pérdida en dólares en ventas al detalle atribuibles a devoluciones de artículos dañados. Puede emitir la siguiente solicitud:
TABLE FILE SALES PRINT RETAIL_PRICE RETURNS DAMAGED COMPUTE RETAIL_LOSS/D12.2 = RETAIL_PRICE * RETURNS + DAMAGED; BY PROD_CODE WHERE PROD_CODE IS 'E1'; END
El cálculo
COMPUTE RETAIL_LOSS/D12.2 = RETAIL_PRICE * RETURNS + DAMAGED;
arroja un resultado incorrecto porque RETAIL_PRICE se multiplica primero por RETURNS y después se suma el resultado a DAMAGED. El resultado correcto se logra sumando RETURNS a DAMAGED y después multiplicando el resultado por RETAIL_PRICE.
El orden de evaluación cambia al poner una expresión entre paréntesis. Una expresión en paréntesis se evalúa antes que cualquier otra expresión. También se puede utilizar el paréntesis para mejorar la legibilidad.
Si utiliza paréntesis, la sintaxis correcta para el cálculo anterior es:
COMPUTE RETAIL_LOSS/D12.2 = RETAIL_PRICE * (RETURNS + DAMAGED);
La salida es:
PROD_CODE RETAIL_PRICE RETURNS DAMAGED RETAIL_LOSS --------- ------------ ------- ------- ----------- E1 $.89 4 7 9.79
Cuando se utiliza aritmética de modo nativo, se sigue una ruta de evaluación específica para cada expresión numérica basada en el formato de los operandos y los operadores. Si todos los operandos tienen el mismo formato, la mayoría de las operaciones se realizan en ese formato: Si los operandos tienen formatos diferentes, se convierten los operandos al formato común en un orden específico de precedencia de formato. Independientemente de los formatos de operandos, algunos operadores requieren conversión a formatos específicos, de manera que todos los operandos estén en los formatos adecuados.
Si todos los operandos de un operador numérico tienen el mismo formato, puede utilizar la tabla siguiente para determinar si se realizan las operaciones en dicho formato nativo o si se convierten los operandos antes y después de ejecutar la operación. En cada caso que requiera conversión, los operandos se convierten al formato operacional y se devuelve el resultado intermedio en el formato operacional. Si el formato del resultado difiere del formato de la variable de destino, el resultado se convierte al formato de la variable de destino.
Operación |
Formato operacional | |
---|---|---|
Adición |
+ |
Nativo |
Sustracción |
- |
Nativo |
Multiplicación |
* |
Nativo |
División completa |
/ |
Acepta punto flotante de precisión simple o doble y convierte todos los demás a punto flotante de doble precisión. |
Exponenciación |
** |
Punto flotante de doble precisión |
Las variables siguientes se definen como números enteros en WebFOCUS Maintain:
COMPUTE OPERANDONE/I4 ; OPERANDTWO/I4 ; RESULT/I4 ;
La multiplicación requerida se realiza en aritmética de modo nativo (aritmética de número enteros):
COMPUTE RESULT/I4 = OPERANDONE * OPERANDTWO ;
Si los operandos de un operador numérico tienen formatos diferentes, puede utilizar la siguiente tabla para determinar cuál es el formato común después de haberlos convertido. El operando más bajo se convierte al formato del operando más alto antes de realizar la operación.
Orden |
Formato |
---|---|
1 |
Decimal empaquetado de 16 bytes |
2 |
Punto flotante de doble precisión |
3 |
Decimal empaquetado de 8 bytes |
4 |
Punto flotante de precisión simple |
5 |
Número entero |
6 |
carácter (alfanumérico y texto) |
Por ejemplo, si se utiliza en una expresión un operando en decimal empaquetado de 16 bytes, todos los demás operandos se convierten en formato de decimal empaquetado de 16 bytes para evaluación. Por otra parte, si una expresión incluye sólo números enteros y operandos alfanuméricos, todos los operandos alfanuméricos se convierten en formato de números enteros.
Un valor de carácter (sea alfanumérico o texto) puede usarse en un cálculo si es una cadena numérica. Se hace un intento por convertir el operando de carácter en el formato del otro operando en la expresión. Si ambos operandos son caracteres, se hace un intento por convertirlos en doble precisión. Si no es posible convertirlos, se genera un mensaje de error.
Si asigna un valor decimal a un número entero, se trunca el valor fraccional.
WebFOCUS |