2011-09-27 21 views
7

Tôi bị nhầm lẫn với được làm tròn trong hàm tính toán trong cobol.tính toán làm tròn trong cobol

Tuyên bố:

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

Procedure.

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


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

Kết quả của VAR-A có phải là 18,27 hoặc 18,26 không? Cobol sẽ làm gì khi tính toán? Nó có thể làm tròn VAR-B đầu tiên đến các chữ số thập phân được chỉ định trong VAR-A hay cobol thêm 2 biến sau đó làm tròn chúng lên các chữ số thập phân được chỉ định trong VAR-A?

Mọi trợ giúp sẽ được đánh giá cao.

@NealB,

Làm thế nào về ví dụ này:

KÊ KHAI:

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. 

Giả VAR-A là một mảng, và sau đây là những giá trị của nó:

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 

Giá trị của VAR-B là:

VAR-B = 405.25 

THỦ TỤC:

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

Tại sao tôi nhận 597,87 cho VAR-B kết quả là sau khi tính toán?

+0

câu trả lời Odd ... tôi nhận được 597,88 mà tôi tin là đúng. Bạn đang sử dụng trình biên dịch COBOL nào? – NealB

Trả lời

5

Tôi tin rằng hành vi làm tròn COBOL mặc định là: Cách xa nhất từ ​​0.

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

nên kết quả trong VAR-A chứa 18,26

Tròn xảy ra sau khi các biểu hiện đã được đánh giá. Một ví dụ thú vị hơn có thể là:

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. 

Kết quả là 18.27. Làm tròn VAR-BVAR-C đến 2 chữ số thập phân trước khi thực hiện việc bổ sung sẽ mang lại 18,26 vì VAR-B làm tròn đến 6,18 và VAR-C vòng tới 0,00. Kết quả thực ra là 18,27 nên việc làm tròn xảy ra sau khi đánh giá biểu thức.

Trả lời cho câu hỏi đã chỉnh sửa

đầu ra Không đẹp, nhưng đây là cách tính toán của tôi đi sử dụng IBM Enterprise COBOL cho 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

Nó phụ thuộc vào làm tròn trung gian và bộ làm tròn cuối cùng.

thấy điều này để biết thêm:

D.13a Tròn

COBOL cung cấp khả năng chỉ định làm tròn trong báo cáo số học và các biểu thức tại các điểm khác nhau trong quá trình đánh giá và như các giá trị được chuẩn bị để lưu trữ trong việc tiếp nhận Các mục dữ liệu.

Có tám hình thức khác nhau của làm tròn được hỗ trợ bởi tiêu chuẩn này:

• AWAY-FROM-ZERO: làm tròn là các giá trị gần nhất của cường độ lớn hơn.

• NEAREST-AWAY-FROM-ZERO: Làm tròn là giá trị gần nhất. Nếu hai giá trị bằng nhau, giá trị có độ lớn hơn được chọn. Chế độ này trong lịch sử được liên kết với mệnh đề ROUNDED trong các phiên bản trước của tiêu chuẩn COBOL.

• NEAREST-EVEN: Làm tròn là giá trị gần nhất. Nếu hai giá trị bằng nhau gần nhau, giá trị có chữ số ngoài cùng bên phải được chọn. Chế độ này đôi khi được gọi là "Làm tròn ngân hàng".

• NEAREST-TOWARD-ZERO: Làm tròn là giá trị gần nhất. Nếu hai giá trị bằng nhau, giá trị với độ lớn nhỏ hơn được chọn.

• PROHIBITED: Vì giá trị không thể biểu diễn chính xác theo định dạng mong muốn, điều kiện EC-SIZE-TRUNCATION được đặt thành tồn tại và kết quả của thao tác không xác định.

• TOWARD-GREATER: Làm tròn về phía giá trị gần nhất có giá trị đại số lớn hơn.

• TOWARD-LESSER: Làm tròn hướng tới giá trị gần nhất có giá trị đại số nhỏ hơn.

• TRUNCATION: Làm tròn là giá trị gần nhất có độ lớn nhỏ hơn. Chế độ này trong lịch sử được liên kết với sự vắng mặt của mệnh đề ROUNDED cũng như cho sự hình thành các kết quả trung gian trong tiêu chuẩn COBOL trước đó.

Lập trình viên có thể chỉ định cách thức các giá trị trung gian riêng lẻ được làm tròn khi chúng được lưu trữ vào việc nhận các mục dữ liệu thông qua mệnh đề ROUNDED; có thể chọn chế độ làm tròn mặc định được sử dụng khi mệnh đề ROUNDED xuất hiện mà không có thêm tiêu chuẩn nào trên một mục dữ liệu nhận được thông qua mệnh đề DEFAULT ROUNDED MODE của đoạn OPTIONS của IDENTIFICATION DIVISION; và có thể chỉ định cách hoạt động số học và chuyển đổi đến và từ các biểu mẫu trung gian được làm tròn thông qua mệnh đề INTERMEDIATE ROUNDING.

D.13a.1 Intermediate tròn

làm tròn Intermediate được áp dụng khi các mục dữ liệu được lấy ra để đưa vào hoạt động một số học hoặc biểu thức số học, và trong quá trình thực hiện các toán tử số học để tạo ra một kết quả trung gian.

Trong tiêu chuẩn trước đó, để nhân và chia trong Số học chuẩn, chế độ làm tròn mặc định cho kết quả không chính xác được cắt ngắn thành 32 chữ số có nghĩa. Mặc định này không thay đổi trong tiêu chuẩn này và cũng là mặc định cho số học Chuẩn-nhị phân và Chuẩn thập phân.

Khi giá trị trung gian có thể được biểu diễn chính xác ở định dạng trung gian thích hợp, giá trị chính xác được sử dụng. Trong trường hợp giá trị không thể được biểu diễn chính xác, người dùng cũng có thể chỉ định các chế độ làm tròn khác cho phép tính số học và chuyển đổi đến và từ các biểu mẫu trung gian được sử dụng trong các phép tính số học thông qua mệnh đề INTERMEDIATE ROUNDING tùy chọn của OPTIONS đoạn của DIVISION DIVISION.

Cụ thể, các tùy chọn sau đây có sẵn:

• INTERMEDIATE làm tròn là gần-AWAY-FROM-ZERO • INTERMEDIATE làm tròn là gần-NGAY CẢ • INTERMEDIATE làm tròn là CẤM • INTERMEDIATE làm tròn là cắt ngắn

mà mô tả phụ được tìm thấy trong D.13a, Làm tròn.

Nếu mệnh đề INTERMEDIATE ROUNDING không được chỉ định, thì GIAI ĐOẠN INTERMEDIATE TRUNCATION được giả định. Điều này không thay đổi so với các tiêu chuẩn trước đó.

D.13a.2 cuối cùng làm tròn (mệnh đề làm tròn)

làm tròn cuối cùng áp dụng cho sự hình thành của các kết quả cuối cùng của biểu thức hoặc tuyên bố, khi hoàn thành đánh giá các báo cáo kết quả hoặc biểu hiện, ngay trước thẻ kết quả được đặt ở đích. Hình thức làm tròn này được liên kết với mệnh đề ROUNDED.

Trong các tiêu chuẩn COBOL trước đó, chỉ có hai phương pháp làm tròn “cuối cùng” được cung cấp: làm tròn về phía độ lớn nhỏ hơn (cắt ngắn, được báo hiệu bởi sự vắng mặt của mệnh đề ROUNDED); và làm tròn đến các giá trị gần nhất, và nếu hai giá trị bằng nhau, hãy chọn giá trị có độ lớn hơn (được báo hiệu bởi sự hiện diện của mệnh đề ROUNDED).

Mệnh tròn đã được tăng cường để cho phép lựa chọn rõ ràng của bất kỳ trong tám phương thức làm tròn (kể cả hai trước đây có sẵn):

• Chế độ làm tròn là AWAY-FROM-ZERO • Chế độ làm tròn là gần-AWAY -Từ-ZERO • Chế độ làm tròn là gần-NGAY CẢ • Chế độ làm tròn là gần-ĐỐI-ZERO • Chế độ làm tròn là cẤM • tròn-mODE ​​LÀ ĐỐI-LỚN • Chế độ làm tròn là ĐỐI-Lesser • tròn chế độ là TRUNCATION

Nếu mệnh đề ROUNDED không có trong một kết quả nhất định, các quy tắc cho ROUNDED MODE IS TRUNCATION sẽ được áp dụng.

Mệnh đề DEFAULT ROUNDED MODE tùy chọn trong phần OPTIONS của IDENTIFICATION DIVISION được cung cấp để cho phép người dùng chỉ định chế độ làm tròn cho bất kỳ thao tác nào mà mệnh đề ROUNDED xuất hiện mà không có MODE IS subclause.
Các DEFAULT tròn khoản THỨC có thể thực hiện bất kỳ các hình thức:

• DEFAULT THỨC được làm tròn là AWAY-FROM-ZERO • DEFAULT THỨC được làm tròn là gần-AWAY-FROM-ZERO • DEFAULT THỨC được làm tròn là gần-NGAY CẢ • DEFAULT THỨC được làm tròn là gần-đỐI-ZERO • DEFAULT THỨC được làm tròn là cẤM • DEFAULT THỨC được làm tròn là đỐI-LỚN • DEFAULT tròn THỨC lÀ đỐI-Lesser • DEFAULT tròn chế độ được cắt ngắn

mà các điều khoản của DEFAULT ROUNDED MODE là mệnh đề a được mô tả trong D.13a, Làm tròn.

Nếu mệnh đề DEFAULT ROUNDED MODE không xuất hiện trong chương trình, hiệu ứng của mệnh đề ROUNDED mà không có MODE IS subclause như thể là ROUNDED MODE IS NEAREST AWAY FROM ZERO đã được chỉ định. Điều này cung cấp chức năng tương tự có sẵn trong các tiêu chuẩn COBOL trước.

Nếu mệnh đề DEFAULT ROUNDED MODE xuất hiện, các mệnh đề ROUNDED không có MODE IS subclause được coi như đã được chỉ định với chế độ làm tròn được chỉ định trong mệnh đề DEFAULT ROUNDED MODE.

+0

Cảm ơn Patrick vì đã trả lời cực nhanh. Đúng với tôi nếu tôi sai, mẫu tôi đã đề cập ở trên đang sử dụng làm tròn cuối cùng. Và vì tôi đã không chỉ định DEFAULT ROUNDED MODE, chế độ làm tròn là MODE ROUNDED IS AWAREST AWAY FROM ZERO. Những gì cobol đã làm là nó thêm các biến và làm tròn giá trị trước khi đặt nó vào biến đích. Điều này cũng có nghĩa là giá trị của VAR-A sẽ là +18.26? – Grekoz

+0

Ở trên có vẻ như nó đã được nâng lên từ tiêu chuẩn dự thảo tiếp theo cho COBOL. Tôi không nghĩ rằng nhiều trình biên dịch COBOL thương mại hỗ trợ đầy đủ điều này. Cho đến lúc đó tôi tin rằng chế độ làm tròn mặc định được sử dụng nhiều nhất là: Cách xa nhất từ ​​Zero. – NealB

+0

Có NealB đúng. –

-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

Câu trả lời này không liên quan gì đến câu hỏi, bạn đã đăng nó không thay đổi như một câu trả lời nữa. Mã là vô dụng. Nếu một trong hai câu hỏi muốn làm điều đó, câu trả lời sẽ là 'COMPUTE VAR-RESULT ROUNDED = VAR-NUM'. Không có 'DIVIDE', không có' MULTIPLY' và không có 'MOVE'. Vui lòng xem xét xóa các câu trả lời này của bạn. –

Các vấn đề liên quan