2011-09-27 38 views
7

Estoy confundido con el redondeado en la función de cálculo en cobol.cálculo redondeado en cobol

Declaración:

VAR-A  PIC S9(9)V99 COMP-3. 
VAR-B  PIC S9(9)V9(6) COMP-3. 

Procedimiento.

MOVE +12.08 TO VAR-A. 
MOVE +6.181657 TO VAR-B. 


COMPUTE VAR-A ROUNDED = VAR-A + VAR-B. 

¿El resultado de VAR-A será 18.27 o 18.26? ¿Qué haría Cobol en la informática? ¿Va a redondear VAR-B primero a los lugares decimales especificados en VAR-A o agregará las dos variables y luego las redondeará a los lugares decimales especificados en VAR-A?

Cualquier ayuda será apreciada.

@NealB,

¿Qué hay de este ejemplo:

DECLARACIÓN:

01 VAR-ARRAY OCCURS 22 TIMES. 
    03 VAR-A  PIC S9(9)V9(6) COMP-3. 


01 VAR-B  PIC S9(9)V99 COMP-3. 

Suponiendo VAR-A es una matriz, y los siguientes son sus valores:

VAR-A(01) = 123.164612 
VAR-A(02) = 12.07865 
VAR-A(03) = 6.181657 
VAR-A(04) = 1.744353 
VAR-A(05) = 6.118182 
VAR-A(06) = 1.744353 
VAR-A(07) = 6.158715 
VAR-A(08) = 1.744353 
VAR-A(09) = 6.194759 
VAR-A(10) = 1.744353 
VAR-A(11) = 3.037896 
VAR-A(12) = 1.743852 
VAR-A(13) = 6.14653 
VAR-A(14) = 1.744353 
VAR-A(15) = 0.000377 
VAR-A(16) = 1.743852 
VAR-A(17) = 6.144363 
VAR-A(18) = 1.743852 
VAR-A(19) = 0.007649 
VAR-A(20) = 1.744353 
VAR-A(21) = 0.000377 
VAR-A(22) = 1.744353 

El valor de VAR-B es:

VAR-B = 405.25 

PROCEDIMIENTO:

PERFORM VAR-IDX FROM 1 BY 1 UNTIL VAR-IDX > 22 
    COMPUTE VAR-B ROUNDED = VAR-B + VAR-A(VAR-IDX) 
END-PERFORM. 

¿Por qué obtengo 597.87 para VAR-B como resultado después del cálculo?

+0

respuesta Odd ... me sale 597.88 que creo que es correcto ¿Qué compilador COBOL estás usando? – NealB

Respuesta

5

Creo que el comportamiento de redondeo de COBOL predeterminado es: Más cercano a cero.

COMPUTE VAR-A ROUNDED = VAR-A + VAR-B 

debería resultar en VAR-A que contiene 18,26

redondeo se produce después de la expresión ha sido evaluada. Un ejemplo más interesante podría ser:

01 VAR-A  PIC S9(9)V99 COMP-3.    
01 VAR-B  PIC S9(9)V9(6) COMP-3.    
01 VAR-C  PIC S9(9)V9(6) COMP-3.    

MOVE +12.08 TO VAR-A.       
MOVE +06.182000 TO VAR-B.      
MOVE +00.004000 TO VAR-C.      
COMPUTE VAR-A ROUNDED = VAR-A + VAR-B + VAR-C. 

El resultado es 18.27. Redondear VAR-B y VAR-C a 2 lugares decimales antes de hacer la suma habría arrojado 18.26 porque VAR-B redondea a 6.18 y VAR-C redondea a 0.00. El resultado es en realidad 18.27 por lo que el redondeo ocurre después de la evaluación de la expresión.

respuesta a la pregunta editada

de salida No bastante, pero esto es como mi cálculo va utilizando IBM Enterprise COBOL para z/OS

 
VAR-IDX = 01 VAR-B = +405.25 VAR-A = +123.164612 VAR-B + VAR-A = +528.41 
VAR-IDX = 02 VAR-B = +528.41 VAR-A = +012.078650 VAR-B + VAR-A = +540.49 
VAR-IDX = 03 VAR-B = +540.49 VAR-A = +006.181657 VAR-B + VAR-A = +546.67 
VAR-IDX = 04 VAR-B = +546.67 VAR-A = +001.744353 VAR-B + VAR-A = +548.41 
VAR-IDX = 05 VAR-B = +548.41 VAR-A = +006.118182 VAR-B + VAR-A = +554.53 
VAR-IDX = 06 VAR-B = +554.53 VAR-A = +001.744353 VAR-B + VAR-A = +556.27 
VAR-IDX = 07 VAR-B = +556.27 VAR-A = +006.158715 VAR-B + VAR-A = +562.43 
VAR-IDX = 08 VAR-B = +562.43 VAR-A = +001.744353 VAR-B + VAR-A = +564.17 
VAR-IDX = 09 VAR-B = +564.17 VAR-A = +006.194759 VAR-B + VAR-A = +570.36 
VAR-IDX = 10 VAR-B = +570.36 VAR-A = +001.744353 VAR-B + VAR-A = +572.10 
VAR-IDX = 11 VAR-B = +572.10 VAR-A = +003.037896 VAR-B + VAR-A = +575.14 
VAR-IDX = 12 VAR-B = +575.14 VAR-A = +001.743852 VAR-B + VAR-A = +576.88 
VAR-IDX = 13 VAR-B = +576.88 VAR-A = +006.146530 VAR-B + VAR-A = +583.03 
VAR-IDX = 14 VAR-B = +583.03 VAR-A = +001.744353 VAR-B + VAR-A = +584.77 
VAR-IDX = 15 VAR-B = +584.77 VAR-A = +000.000377 VAR-B + VAR-A = +584.77 
VAR-IDX = 16 VAR-B = +584.77 VAR-A = +001.743852 VAR-B + VAR-A = +586.51 
VAR-IDX = 17 VAR-B = +586.51 VAR-A = +006.144363 VAR-B + VAR-A = +592.65 
VAR-IDX = 18 VAR-B = +592.65 VAR-A = +001.743852 VAR-B + VAR-A = +594.39 
VAR-IDX = 19 VAR-B = +594.39 VAR-A = +000.007649 VAR-B + VAR-A = +594.40 
VAR-IDX = 20 VAR-B = +594.40 VAR-A = +001.744353 VAR-B + VAR-A = +596.14 
VAR-IDX = 21 VAR-B = +596.14 VAR-A = +000.000377 VAR-B + VAR-A = +596.14 
VAR-IDX = 22 VAR-B = +596.14 VAR-A = +001.744353 VAR-B + VAR-A = +597.88 
FINAL RESULT = +597.88            
1

Depende del redondeo intermedio y del redondeo final.

ver este para más información:

D.13a Redondeo

COBOL proporciona la capacidad de especificar el redondeo en los estados aritméticas y expresiones en varios puntos en el proceso de evaluación y como valores se preparan para el almacenamiento en recibir elementos de datos.

Hay ocho formas diferentes de redondeo compatible con este estándar:

• fuera-de-CERO: El redondeo es al valor más cercano de magnitud mayor.

• MÁS CERCANO A FUERA DE CERO: Redondeo al valor más cercano. Si dos valores están igualmente cerca, se selecciona el valor con mayor magnitud. Históricamente, este modo se ha asociado con la cláusula ROUNDED en versiones anteriores de COBOL estándar.

• MÁS CERCANO: redondeo al valor más cercano. Si dos valores están igualmente cerca, se selecciona el valor cuyo dígito más a la derecha sea par. Este modo a veces se llama "redondeo bancario".

• MÁS CERCA DE HORA: Redondeo al valor más cercano. Si dos valores están igualmente cerca, se selecciona el valor con la magnitud más pequeña.

• PROHIBIDO: Como el valor no se puede representar exactamente en el formato deseado, la condición EC-SIZE-TRUNCATION se establece para existir y los resultados de la operación no están definidos.

• HACIA ADELANTE: El redondeo es hacia el valor más cercano cuyo valor algebraico es mayor.

• HACIA ABAJO: El redondeo es hacia el valor más cercano cuyo valor algebraico es más pequeño.

• TRUNCACIÓN: El redondeo es al valor más cercano cuya magnitud es menor. Históricamente, este modo se ha asociado con la ausencia de la cláusula ROUNDED así como también con la formación de resultados intermedios en el estándar COBOL anterior.

El programador puede especificar cómo se redondean los valores intermedios individuales cuando se almacenan en elementos de datos de recepción a través de la cláusula ROUNDED; puede seleccionar un modo de redondeo predeterminado que se utilizará cuando la cláusula ROUNDED aparezca sin calificación adicional en un elemento de datos receptor a través de la cláusula MODO REDONDEADO PREDETERMINADO del párrafo OPCIONES de la DIVISIÓN DE IDENTIFICACIÓN; y puede especificar cómo se redondean las operaciones aritméticas y las conversiones hacia y desde las formas intermedias a través de la cláusula INTERMEDIATE ROUNDING.

D.13a.1 Intermedio redondeo

redondeo intermedio se aplica cuando los elementos de datos se recuperan para su inclusión en una operación aritmética o expresión aritmética, y durante la ejecución de los operadores aritméticos para producir un resultado intermedio.

En la norma anterior, para multiplicación y división en Aritmética estándar, el modo de redondeo predeterminado para resultados inexactos era el truncamiento a 32 dígitos significativos. Este valor predeterminado no se modifica en este estándar, y también es el predeterminado para la aritmética Estándar-Binaria y Decimal-Decimal.

Cuando el valor intermedio se puede representar exactamente en el formato intermedio apropiado, se usa el valor exacto.

En el caso de que el valor no pueda representarse exactamente, el usuario puede ahora especificar otros modos de redondeo para operaciones aritméticas y conversiones hacia y desde formas intermedias usadas en las operaciones aritméticas a través de la cláusula opcional INTERMEDIATE ROUNDING de OPTIONS párrafo de la DIVISIÓN DE IDENTIFICACIÓN.

En concreto, las siguientes opciones están disponibles:

• INTERMEDIO redondeo es CERCANA-lejos-de-CERO • INTERMEDIO redondeo es CERCANO DE EQUILIBRIO • INTERMEDIO redondeo se PROHIBIDO • INTERMEDIO redondeo es TRUNCAMIENTO

para el cual las descripciones de la subcláusula se encuentran en D.13a, Redondeo.

Si no se especifica la cláusula INTERMEDIA DE REDONDEACIÓN, se presume que REDONDEAR INTERMEDIA ES TRUNCACIÓN. Esto no se modifica con los estándares anteriores.

D.13a.2 final redondeo (la cláusula redondeado)

redondeo final se aplica a la formación del resultado final de la expresión o declaración, a la finalización de la evaluación de la declaración o expresión, inmediatamente antes de la el resultado se coloca en el destino. Esta forma de redondeo es la que está asociada con la cláusula ROUNDED.

En las normas COBOL anteriores, solo se proporcionaban dos métodos de redondeo "final": redondeo hacia la magnitud menor (truncamiento, señalado por la ausencia de la cláusula ROUNDED); y redondeando a los valores más cercanos, y si dos valores estaban igualmente cerca, elija el valor con la magnitud más grande (señalada por la presencia de la cláusula ROUNDED).

La cláusula REDONDEADO se ha mejorado para permitir la selección explícita de cualquiera de los ocho modos de redondeo (incluyendo los dos previamente disponible):

• Modo redondeado fuera-de-ZERO • MODO REDONDEADO es la más cercana-AWAY -DE-ZERO • MODO rEDONDEADO es la más cercana DE EQUILIBRIO • MODO redondeado-CERCANO HACIA-ZERO • MODO rEDONDEADO SE PROHÍBE • redondeado MODO ES HACIA MAYOR- • MODO rEDONDEADO es hacia Minoritarias • rEDONDEADO modo es TRUNCACIÓN

Si la cláusula ROUNDED no está presente para un resultado dado, se aplican las reglas para el MODO REDONDEADO TRUNCATION.

La cláusula de MODO REDONDEO PREDETERMINADO opcional en el párrafo OPCIONES de la DIVISIÓN DE IDENTIFICACIÓN se proporciona para permitir al usuario especificar el modo de redondeo a cualquier operación para la cual la cláusula ROUNDED aparece sin la subcláusula MODO IS.
La cláusula MODO POR DEFECTO redondeada puede tomar cualquiera de estas formas:

• modo por defecto redondeado fuera-de-ZERO • modo por defecto REDONDEADO está más cerca-lejos-de-ZERO • modo por defecto redondeado CERCANO DE EQUILIBRIO • modo por defecto redondeado CERCANA-HACIA-ZERO • modo por defecto rEDONDEADO está prohibido • modo por defecto redondeado HACIA-MAYOR • modo por defecto rEDONDEADO es hacia Minoritarias • DEFAULT rEDONDEADO MODO es que se trunca

para el cual el subcláusulas del MODO REDONDEADO PREDETERMINADO es la cláusula a descrito en D.13a, Redondeo.

Si la cláusula MODO REDONDEADO PREDETERMINADO no aparece en el programa, se ha especificado el efecto de la cláusula REDONDEADA sin la subcláusula MODO IS como si el MODO REDONDO ESTÁ MÁS CERCA DE CERO. Esto proporciona la misma funcionalidad disponible en los estándares COBOL anteriores.

Si aparece la cláusula DEFAULT ROUNDED MODE, las cláusulas ROUNDED sin la subcláusula MODE IS se tratan como si se hubieran especificado con el modo de redondeo especificado en la cláusula DEFAULT ROUNDED MODE.

+0

Gracias Patrick por la respuesta súper rápida. Corrija si estoy equivocado, la muestra que mencioné anteriormente está utilizando el redondeo final. Y como no especifiqué el MODO REDONDEADO POR DEFECTO, el modo de redondeo es el MODO REDONDEADO MÁS CERCA DE CERO. Lo que hicieron los cobol es que agregó las variables y redondeó el valor antes de colocarlo en la variable de destino. ¿Qué también significa que el valor de VAR-A sería +18.26? – Grekoz

+0

Lo anterior parece que se eliminó del próximo borrador de estándar para COBOL. No creo que muchos compiladores COBOL comerciales lo soporten completamente todavía. Hasta entonces, creo que el modo de redondeo predeterminado empleado por la mayoría es: Nearest Away From Zero. – NealB

+0

Sí, NealB es correcto. –

-1
IDENTIFICATION DIVISION. 
PROGRAM-ID. HELLO. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 

01 VAR_NUM PIC 9(3)V9(02). 
01 VAR_RESULT PIC 9(3). 


PROCEDURE DIVISION. 
    MOVE 256.50 TO VAR_NUM. 
    COMPUTE VAR_NUM ROUNDED = VAR_NUM/100. 
    MULTIPLY 100 BY VAR_NUM 
    MOVE VAR_NUM TO VAR_RESULT. 
    DISPLAY "Result : " VAR_RESULT. 

STOP RUN. 
+0

Esta respuesta no tiene nada que ver con la pregunta, la has publicado sin cambios como otra respuesta también. El código es inútil. Si alguna de las preguntas quería hacer eso, la respuesta sería 'COMPUTE VAR-RESULT ROUNDED = VAR-NUM'. No 'DIVIDE', no' MULTIPLY' y no 'MOVE'. Por favor, considere eliminar estas respuestas suyas. –