以下の非常に最小限の、非常に些細な COBOL プログラムで私が間違っていることを正確に指摘してくれると、非常に感謝します。COBOL の標準ツールである言語要素 ROUNDED を使用して、結果の丸めを実行します。隠れた動機は、大規模なアプリケーションを構築し、一連の長い一連の操作とそれに続く各モードの丸めを考慮して、さまざまな丸めモードに時間メトリックを適用することです。(さらに下層の動機は、COBOL を逆方向に学習することです。これはその計画内のプロジェクトにすぎず、COBOL を使用して開発する仕事に就こうとします)。
プログラムを以下に示します。単純な加算を 1 回実行し、その結果を、丸めを適用するより小さいデータ幅の変数に渡します。
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. ROUNDINGTEST.
000300 ENVIRONMENT DIVISION.
000400 DATA DIVISION.
000500 WORKING-STORAGE SECTION.
000600 01 OPERAND01 PIC S9(2)V9(4) VALUE 1.4745.
000610 01 OPERAND02 PIC S9(2)V9(4) VALUE 1.9874.
000610 01 RESULT PIC S9(2)V9(2).
000700 PROCEDURE DIVISION.
000800 PROGRAM-BEGIN.
000900 COMPUTE RESULT ROUNDED MODE NEAREST-EVEN
001000 = OPERAND01 + OPERAND02
001010 END-COMPUTE
001020
001100 PROGRAM-DONE.
001200 STOP RUN.
以下のように、GnuCOBOLのコンパイラでコンパイルすると、以下の結果が得られます。
martin@martin-1001PX:~/CobolProjects$ cobc -b ROUNDINGTEST.cob
ROUNDINGTEST.cob: In paragraph 'PROGRAM-BEGIN':
ROUNDINGTEST.cob:11: Error: syntax error, unexpected MODE
martin@martin-1001PX:~/CobolProjects$
指定されたモードを他のモード、切り捨て、より少ない方向に交換しても、変化は生じません。行 000900、001000、および 001010 をコメント アウトすると、エラーのない応答が返されます。そのため、明らかに問題は、コードの初期段階からのカスケードの問題や、後の何らかの構文上の問題ではなく、機能しない丸めです。
GNU COBOL 2.0 (以前の OpenCOBOL) [2012 年 2 月 11 日版] プログラマーズ ガイド第 2 版、2013 年 11 月 21 日
以下のようなCOMPUTE構文を持っています
COMPUTE { 一意名-1 [ 丸めオプション ] } … =|EQUAL 算術式-1 [ サイズ誤差節 ] [ END-COMPUTE ]
修飾子 ROUNDED (上記の rounding-option) の構文は次のとおりです。
AWAY-FROM-ZERO
NEAREST-AWAY-FROM-ZERO
NEAREST-EVEN
ROUNDED MODE IS NEAREST-TOWARD-ZERO
PROHIBITED
TOWARD-GREATER
TOWARD-LESSER
TRUNCATION
ここで、「IS」は必須ではない読みやすさのオプションです。
これはコンパクトで些細なことのように思えるかもしれませんが、改訂やテストを行っても成功することはありませんでした。この件に関する有意義なコミュニケーションをいただければ幸いです。