27.5 数字項目のけた拡張機能の注意事項

ここでは,数字項目のけた拡張機能の注意事項について説明します。

<この節の構成>
(1) 数字項目のけた拡張機能を使用する場合の演算結果
(2) 内部浮動小数点項目から固定小数点形式の数字項目への転記

(1) 数字項目のけた拡張機能を使用する場合の演算結果

数字項目のけた拡張機能を使用する場合,中間結果で保持するけた数が40けたとなります。そのため,従来の1~18けたの演算であっても,数字項目のけた拡張機能を使用しない場合と演算結果が異なるときがあります。数字項目のけた拡張機能を使用しない場合の演算結果と合わせるときは,別の数字項目を使用して演算を分けてください。

(例)
  01 A  PIC 9(4)  VALUE  0.
  01 B  PIC 9(2)  VALUE 10.
  01 C  PIC 9(1)  VALUE  4.
         :    
  COMPUTE A = (B / C) * 100.

上記のCOMPUTE文は,次のような連続した操作に変換します。なお,tempはこのシステムが用意する中間結果項目です。

  B / C      → temp
  temp * 100 → A

数字項目のけた拡張機能を使用する場合,演算結果は次のようになります。

表27-9 数字項目のけた拡張機能を使用する場合の演算結果

数字項目のけた拡張機能の使用有無tempの属性tempに設定される(B / C)の値temp * 100の値Aに設定される値
使用する40けた10進浮動小数点2.500・・・・000
(40けたの数値)
250.000・・・・000
(40けたの数値)
250
使用しない次のけた数の数字項目
 整数部のけた数:2
 小数部のけた数:なし
2200200
注※
数字項目のけた拡張機能を使用しないときの中間結果のけた数は,「5.2.4 演算の中間結果」を参照してください。

数字項目のけた拡張機能を使用する場合の計算結果を,数字項目のけた拡張機能を使用しないときと同じにするには,次のように除算(B/C)の結果を別の数字項目WK1(数字項目のけた拡張機能を使用しない場合のtempの属性と同じけた数で定義)に転記したもので演算します。

  01 A   PIC 9(4)  VALUE  0.
  01 B   PIC 9(2)  VALUE 10.
  01 C   PIC 9(1)  VALUE  4.
  01 WK1 PIC 9(2)  VALUE  0.
         :    
  COMPUTE WK1 = B / C.
  COMPUTE A = WK1 * 100.

(2) 内部浮動小数点項目から固定小数点形式の数字項目への転記

内部浮動小数点項目から固定小数点形式の数字項目への転記で,固定小数点形式の数字項目が内部浮動小数点項目の有効けたを超える下位のけたを持つ場合,下位のけたが大きくなるほど,誤差の影響も大きくなります。

内部浮動小数点数の小数点位置合わせに伴う誤差の影響が,けた数の拡張によって現れる例を次に示します。なお,内部浮動小数点数の有効けた数および標準けた寄せ規則については,マニュアル「COBOL2002 言語 拡張仕様編 6. 浮動小数点形式データを扱う機能」を参照してください。

(例)
  01 A  USAGE COMP-2    VALUE 2.0E+0.
  01 B  PIC 9(1)V9(14).
  01 C  PIC 9(1)V9(23).
         :
  COMPUTE B = A.
  COMPUTE C = A.
         :

(出力結果)
  B = +200000000000000
  C = +199999999999999983222784