2011-09-27 15 views
7

Jestem mylony z zaokrągloną w funkcji obliczeniowej w cobol.obliczenia zaokrąglone w cobol

Oświadczenie:

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

procedury.

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


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

Czy wynik VAR-A będzie wynosił 18,27 lub 18,26? Co zrobiłby cobol w obliczeniach? Czy najpierw zaokrąglić VAR-B do miejsc dziesiętnych określonych w VAR-A, czy będzie dodawać 2 zmienne, a następnie zaokrąglać je do miejsc dziesiętnych określonych w VAR-A?

Każda pomoc zostanie doceniona.

@NealB,

Jak o tym przykładzie:

OŚWIADCZENIE:

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. 

Zakładając VAR A jest macierzą, a jej wartości są następujące:

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 

Wartość VAR-B wynosi:

VAR-B = 405.25 

PROCEDURA:

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

Dlaczego otrzymuję 597,87 za VAR-B w wyniku po obliczeniach?

+0

Odd odpowiedź ... Mam 597.88 , które uważam za poprawne. Którego kompilatora COBOL używasz? – NealB

Odpowiedz

5

Uważam, że domyślne zachowanie zaokrąglania COBOL jest: Najbliższe od zera.

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

powinno spowodować VAR-A zawierający 18,26

Zaokrąglenie następuje po ekspresji badano. Bardziej interesującym przykładem może być:

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. 

Wynikiem jest 18,27. Zaokrąglanie VAR-B i VAR-C do 2 miejsc po przecinku przed dodaniem dałoby 18,26, ponieważ VAR-B zaokrągla do 6,18, a pociski VAR-C do 0,00. Wynik jest w rzeczywistości 18,27, więc zaokrąglenie następuje po oszacowaniu wyrażenia.

Odpowiedz do edytowanej pytanie

wyjście nie całkiem, ale to jest jak moja kalkulacja idzie za pomocą programu IBM Enterprise COBOL for 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

To zależy od zaokrąglenia pośredniego i końcowego zestawu zaokrągleń.

zobaczyć więcej informacji:

D.13a Zaokrąglanie

COBOL zapewnia możliwość określenia zaokrąglenia w arytmetyce instrukcji i wyrażeń w różnych punktach procesu oceny wartości i jak przygotowuje się do przechowywania w otrzymaniu elementy danych.

Istnieje osiem różnych form zaokrąglenia obsługiwane przez tego standardu:

• dala od zera: Zaokrąglanie jest do najbliższej wartości większej wielkości.

• NEAREST-AWAY-FROM-ZERO: Zaokrąglanie jest do najbliższej wartości. Jeśli dwie wartości są jednakowo bliskie, wybierana jest wartość o większej wartości. Ten tryb był historycznie związany z klauzulą ​​ROUNDED w poprzednich wersjach standardowego języka COBOL.

• NAJBLIŻSZY NAWET: Zaokrąglanie jest do najbliższej wartości. Jeżeli dwie wartości są jednakowo blisko, wybierana jest wartość, której cyfra z prawej strony jest parzyste. Ten tryb jest czasami nazywany "zaokrąglaniem bankiera".

• NEAREST-TOWARD-ZERO: Zaokrąglanie jest do najbliższej wartości. Jeśli dwie wartości są jednakowo bliskie, wybierana jest wartość o mniejszej wartości.

• ZABRONIONE: Ponieważ wartości nie można dokładnie przedstawić w żądanym formacie, warunek EC-SIZE-TRUNCATION jest ustawiony, a wyniki operacji są niezdefiniowane.

• TOWARD-GREATER: Zaokrąglanie jest najbliższe najbliższej wartości, której wartość algebraiczna jest większa.

• TOWARD-LESSER: Zaokrąglenie jest zbliżone do najbliższej wartości, której wartość algebraiczna jest mniejsza.

• TRUNCATION: Zaokrąglanie jest do najbliższej wartości, której wielkość jest mniejsza. Ten tryb był historycznie związany z nieobecnością klauzuli ROUNDED, jak również z tworzeniem wyników pośrednich w poprzednim standardzie COBOL.

Programista może określić w jaki sposób poszczególne wartości pośrednie są zaokrąglane, gdy są przechowywane, w celu odbierania elementów danych za pośrednictwem klauzuli ZAOKRĄGLONE; może wybrać domyślny tryb zaokrąglania, który będzie używany, gdy zostanie wyświetlona klauzula ZAOKRĄGLONE bez dalszych kwalifikacji na odbierającym elemencie danych poprzez klauzulę TRYB ZAOKRĄGLEJOWANY z sekcji OPCJE w PODZIAŁU IDENTYFIKACYJNYM; i może określać, w jaki sposób operacje arytmetyczne i konwersje do iz formularzy pośrednich są zaokrąglane poprzez klauzulę POŚREDNIEGO ZAOKRĄŻENIA.

D.13a.1 pośredni zaokrąglenia

Pośredni zaokrąglania, gdy stosuje się elementy danych są pobierane w celu włączenia do operacji arytmetycznej lub wyrażenia arytmetycznego i podczas wykonywania operatorów arytmetycznych z wytworzeniem wynik pośredni.

W poprzednim standardzie dla mnożenia i dzielenia w arytmetyce standardowej domyślnym trybem zaokrąglania wyników niedokładnych było obcięcie do 32 cyfr znaczących. Ta wartość domyślna pozostaje niezmieniona w tym standardzie i jest również domyślna dla arytmetyki standardowa-binarna i dziesiętna standardowa.

Gdy wartość pośrednią można przedstawić dokładnie w odpowiednim formacie pośrednim, używana jest dokładna wartość.

W przypadku, gdy wartość nie może być dokładnie odwzorowana, użytkownik może teraz określić inne tryby zaokrąglania dla operacji arytmetycznych i dla konwersji z pośrednich formularzy używanych w operacjach arytmetycznych za pomocą opcjonalnej klauzuli INTERMEDIATE ROUNDING opcji. akapit OZNACZA IDENTYFIKACYJNEGO.

Konkretnie, dostępne są następujące opcje:

• INTERMEDIATE zaokrąglania jest najbliżej z dala od zera • INTERMEDIATE zaokrąglania jest najbliżej nawet • INTERMEDIATE zaokrąglenia jest ZABRONIONE • INTERMEDIATE zaokrąglenia jest obcięcie

, dla której opisy podpunktu znajdują się w D.13a, Zaokrąglanie.

Jeśli nie zostanie określona klauzula ZA POŚREDNIEGO ZAOKRĄGLENIA, zakłada się POŚREDNIE ZAOKRĄGLONE JEST TORUNEK. Jest to niezmienione w stosunku do poprzednich standardów.

D.13a.2 końcowe zaokrąglenie (zaokrąglonemu w pkt)

końcowe zaokrąglenie stosuje się do formowania końcowego wyniku ekspresji lub rachunku, po zakończeniu oceny rachunku lub ekspresji, bezpośrednio przed wynik zostanie umieszczony w miejscu docelowym. Ta forma zaokrąglania jest tą, która jest związana z klauzulą ​​ROUNDED.

W poprzednich normach COBOL podano tylko dwie metody "końcowego" zaokrąglania: zaokrąglanie w kierunku mniejszej wielkości (obcięcie, sygnalizowane przez brak klauzuli ROUNDED); i zaokrąglenie do najbliższych wartości, a jeśli dwie wartości były jednakowo bliskie, wybierz wartość o większej wartości (sygnalizowana obecnością klauzuli ROUNDED).

zaokrąglonego klauzula została wzmocniona, aby umożliwić wyraźny wybór któregokolwiek z ośmiu trybów zaokrąglania (w tym dwóch poprzednio dostępne):

• Zaokrąglone tryb jest z dala od zera • Zaokrąglone TRYBIE jest najbliżej z szafy -Z zero • zaokrąglonymi TRYBU jest najbliżej nawet • zaokrąglonymi TRYBU jest najbliżej-KU zero • zaokrąglonymi mode jest zakazany • zaokrąglonymi-MODE była skierowana-WIĘKSZEJ • zaokrąglonymi TRYB jest skierowany-MNIEJSZA • zaokrąglonymi mode jest TRUNCATION

Jeśli dla danego wyniku nie ma klauzuli ZAOKRĄGŁA, obowiązują reguły TRYB ZAOKRĄGLEZOWANY.

Opcjonalna klauzula TRYB ZAUFANIA WARTOŚCIOWEGO w akapicie OPCJE DYWIDACJI IDENTYFIKACYJNEJ umożliwia użytkownikowi określenie trybu zaokrąglania do dowolnej operacji, dla której pojawia się klauzula ROUNDED bez podrozdziału MODE IS.
DEFAULT zaokrąglonymi klauzula TRYB może podjąć każdy z tych form:

• Domyślne Zaokrąglone tryb jest z dala od zera • Domyślne Zaokrąglone TRYB jest najbliżej z dala od zera • Domyślne Zaokrąglone TRYBIE jest najbliżej, nawet • DEFAULT zaokrąglonymi TRYBU jest najbliżej-KU zero • DEFAULT zaokrąglonymi mode jest zakazany • DEFAULT zaokrąglonymi TRYBU jest skierowany-WIĘKSZEJ • domyślne zaokrąglonymi TRYBU jest skierowany-MNIEJSZA • DEFAULT zaokrąglonymi mode jest obcinanie

dla którego podrozdziałami TRYBU ZAOKRĄGLEŁOWEGO jest klauzula a ponownie opisane w D.13a, Zaokrąglanie.

Jeśli klauzula ZASTRZEŻONE DEFAULT nie pojawi się w programie, efekt klauzuli ROUNDED bez podrozdziału MODE IS jest taki, jak gdyby został określony TRYB POKRĘTŁO JEST NAJBLIŻSZY OD ZERO. Zapewnia to tę samą funkcjonalność, która jest dostępna we wcześniejszych standardach COBOL.

Jeśli pojawi się klauzula TRYB ZAOSZCZĘDNY, klauzule ZAOKRĄGLANE bez podrozdziału MODE IS są traktowane tak, jakby zostały określone w trybie zaokrąglania określonym w klauzuli TRYB ZAUFANIA WARTOŚCI DOMYŚLNEJ.

+0

Dziękuję Patrickowi za super szybką odpowiedź. Popraw mnie, jeśli się mylę, próbka, o której wspomniałem powyżej, używa końcowego zaokrąglenia. A ponieważ nie określiłem TRYBU ZAOKRĄGLEŁOWEGO, tryb zaokrąglania jest TRYB ZAOKRĘŻONY JEST NAJBLIŻSZY OD ZERO. Co zrobił cobol to dodawanie zmiennych i zaokrąglanie wartości przed umieszczeniem jej w zmiennej docelowej. Co oznacza także, że wartość VAR-A wynosiłaby + 18,26? – Grekoz

+0

Powyższe wygląda na to, że został on podniesiony z następnego projektu standardu dla COBOL. Nie sądzę, aby wiele komercyjnych kompilatorów języka COBOL w pełni ją wspierało. Do tego czasu uważam, że domyślny tryb zaokrąglania stosowany przez większość to: Najbliższy od zera. – NealB

+0

Tak NealB, który jest poprawny. –

-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

Ta odpowiedź nie ma nic wspólnego z pytaniem, napisałeś ją w niezmienionej formie jako inną odpowiedź. Kod jest bezużyteczny. Jeśli którekolwiek z pytań chciałoby to zrobić, odpowiedź brzmiałaby: "WYKRES ODPOWIEDZI ZA LICZBĘ VAR = VAR-NUM". Nie "DIVIDE", brak 'MULTIPLY' ani' MOVE'. Rozważ usunięcie tych odpowiedzi. –