COBOLの計算関数の丸めと混同しています。
宣言:
VAR-A PIC S9(9)V99 COMP-3.
VAR-B PIC S9(9)V9(6) COMP-3.
手順。
MOVE +12.08 TO VAR-A.
MOVE +6.181657 TO VAR-B.
COMPUTE VAR-A ROUNDED = VAR-A + VAR-B.
VAR-Aの結果は18.27または18.26になりますか? COBOLはコンピューティング時に何をしますか?最初にVAR-BをVAR-Aで指定された小数点以下の桁数に丸めますか、それとも2つの変数をCOBOLで加算してから、VAR-Aで指定された小数点以下の桁数に切り上げますか?
どんな助けでもありがたいです。
@ NealB、
この例はどうですか:
宣言:
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.
VAR-Aが配列であり、その値は次のとおりです。
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
VAR-Bの値は次のとおりです。
VAR-B = 405.25
手順:
PERFORM VAR-IDX FROM 1 BY 1 UNTIL VAR-IDX > 22
COMPUTE VAR-B ROUNDED = VAR-B + VAR-A(VAR-IDX)
END-PERFORM.
計算後、結果としてVAR-Bで597.87が得られるのはなぜですか?
デフォルトのCOBOLの丸め動作は次のとおりです。ゼロから最も近い。
COMPUTE VAR-A ROUNDED = VAR-A + VAR-B
結果はVAR-A
18.26を含む
丸めは、式が評価された後に行われます。より興味深い例は次のとおりです。
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.
結果は18.27です。丸めVAR-B
およびVAR-C
VAR-Bは6.18に丸められ、VAR-Cは0.00に丸められるため、加算を行う前に小数点以下2桁までは18.26になります。結果は実際には18.27であるため、式の評価後に丸めが行われます。
編集した質問への返信
きれいな出力ではありませんが、これが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 最終結果= + 597.88
これは、中間丸めと最終丸めセットによって異なります。
詳細については、これを参照してください:
D.13a丸め
COBOLは、評価プロセスのさまざまな時点で、および受信データ項目に格納するための値が準備されるときに、算術ステートメントおよび式で丸めを指定する機能を提供します。
この標準でサポートされている丸めには、8つの異なる形式があります。
•AWAY-FROM-ZERO:丸めは、より大きな大きさの最も近い値になります。
•NEAREST-AWAY-FROM-ZERO:丸めは最も近い値になります。 2つの値が等しく近い場合は、大きさが大きい方の値が選択されます。このモードは、これまで、標準COBOLの以前のバージョンのROUNDED句に関連付けられていました。
•NEAREST-EVEN:丸めは最も近い値になります。 2つの値が等しく近い場合、右端の桁が偶数である値が選択されます。このモードは、「バンカーの丸め」と呼ばれることもあります。
•NEAREST-TOWARD-ZERO:丸めは最も近い値になります。 2つの値が等しく近い場合は、大きさが小さい方の値が選択されます。
•禁止:値を目的の形式で正確に表すことができないため、EC-SIZE-TRUNCATION条件が存在するように設定され、操作の結果は未定義です。
•TOWARD-GREATER:丸めは、代数的値が大きい最も近い値に向かって行われます。
•TOWARD-LESSER:丸めは、代数的値が小さい最も近い値に向かって行われます。
•切り捨て:丸めは、大きさが小さい最も近い値になります。このモードは、歴史的にROUNDED句がないこと、および以前のCOBOL標準での中間結果の形成に関連付けられてきました。
プログラマーは、ROUNDED句を使用して、受信データ項目に格納されるときに個々の中間値を丸める方法を指定できます。 IDENTIFICATIONDIVISIONのOPTIONS段落のDEFAULTROUNDED MODE句を介して、ROUNDED句が表示され、受信データ項目にそれ以上の修飾がない場合に使用される丸めのデフォルトモードを選択できます。また、INTERMEDIATEROUNDING句を使用して算術演算と中間形式への変換および中間形式からの変換を丸める方法を指定できます。
D.13a.1中間丸め
中間丸めは、算術演算または算術式に含めるためにデータ項目が取得されるとき、および中間結果を生成するための算術演算子の実行中に適用されます。
以前の標準では、標準算術の乗算と除算の場合、不正確な結果の丸めのデフォルトモードは、有効数字32桁に切り捨てられていました。このデフォルトは、この標準では変更されておらず、Standard-BinaryおよびStandard-Decimal演算のデフォルトでもあります。
中間値を適切な中間形式で正確に表すことができる場合は、正確な値が使用されます。
値を正確に表すことができない場合、ユーザーは、IDENTIFICATIONのOPTIONS段落のオプションのINTERMEDIATE ROUNDING句を使用して、算術演算および算術演算で使用される中間形式との間の変換に他の丸めモードを指定することもできます。分割。
具体的には、次のオプションを使用できます。
•中間丸めIS NEAREST-AWAY-FROM-ZERO•中間丸めIS NEAREST-EVEN•中間丸めIS禁止•中間丸めIS切り捨て
節の説明はD.13a、丸めに記載されています。
INTERMEDIATE ROUNDING句が指定されていない場合、INTERMEDIATE ROUNDING IS TRUNCATIONが推定されます。これは以前の標準から変更されていません。
D.13a.2最終丸め(ROUNDED句)
最終丸めは、ステートメントまたは式の評価の完了時、結果が宛先に配置される直前の、式またはステートメントの最終結果の形成に適用されます。この形式の丸めは、ROUNDED句に関連付けられている形式です。
以前のCOBOL標準では、「最終的な」丸めの2つの方法のみが提供されていました。小さい方への丸め(切り捨て、ROUNDED句がないことによって示されます)。そして、最も近い値に丸め、2つの値が等しく近い場合は、大きさが大きい値を選択します(ROUNDED句の存在によって示されます)。
ROUNDED句が拡張され、8つの丸めモード(以前に使用可能だった2つを含む)のいずれかを明示的に選択できるようになりました。
•ラウンドモードIS AWAY-FROM-ZERO•ラウンドモードIS NEAREST-AWAY-FROM-ZERO•ラウンドモードIS = NEAREST-EVEN•ROUNDEDMODE IS NEAREST-TOWARD-ZERO•ROUNDEDMODE IS禁止•ROUNDED-MODE IS TOWARD-GREATER•ROUNDEDMODE IS TOWARD-LESSER•ROUNDEDMODE IS TRUNCATION
特定の結果にROUNDED句が存在しない場合、ROUNDED MODE IS TRUNCATIONのルールが適用されます。
IDENTIFICATIONDIVISIONのOPTIONS段落にあるオプションのDEFAULTROUNDED MODE句は、MODE IS)節なしでROUNDED句が表示される操作への丸めモードをユーザーが指定できるようにするために提供されています。
DEFAULT ROUNDED MODE句は、次のいずれかの形式をとることができます。
•デフォルトの丸めモードIS AWAY-FROM-ZERO•デフォルトの丸めモードIS NEAREST-AWAY-FROM-ZERO•デフォルトの丸めモードIS NEAREST-EVEN•デフォルトの丸めモードIS NEAREST-TOWARD-ZERO•デフォルトの丸めモードIS禁止•デフォルトの丸めモードIS TOWARD-GREATER•デフォルトの丸めモードIS TOWARD-LESSER•デフォルトの丸めモードIS切り捨て
dEFAULT ROUNDED MODEの副節が節であるものについては、D.13aの丸めで説明されています。
DEFAULT ROUNDED MODE句がプログラムに表示されない場合、MODE IS節のないROUNDED句の効果は、ROUNDED MODE IS NEARESTAWAYのようになります。 FROM ZEROが指定されていました。これにより、以前のCOBOL標準で使用可能なものと同じ機能が提供されます。
DEFAULT ROUNDED MODE句が表示された場合、MODE IS節のないROUNDED句は、DEFAULT ROUNDEDMODE句で指定された丸めモードで指定されたかのように扱われます。