浮動小数点形式

横山 倬央(富士通株式会社 ソフトウェアプロダクト事業本部)

2014年版COBOL国際規格において、浮動小数点形式に関する以下の機能が強化されました。

ISO/IEC 60559 (IEEE 754)を反映した、二進数及び十進数の浮動小数点形式のサポート
ISO/IEC 60559 (IEEE 754)を反映した、8種類の丸め形式をサポート
この機能追加の主な目的は、既存のプラットフォームおよび言語に依存しない国際標準規格(ISO/IEC/IEEE 60559) による演算結果を提供し、COBOLアプリケーションの移植性を向上させることにあります。
この標準に準拠して生成される結果は明確に定義されていることから、ISO/IEC/IEEE 60559フォーマットのデータ項目を格納して操作する効率的な手段をベンダーが実装することが予想され、そのような実装も効率的になることが期待されます。
COBOLデータ型、演算規則、丸めおよび切り捨てアルゴリズムをサポートするISO/IEC/IEEE 60559仕様を使用すると、不正確さを制御して最小限に抑えることができます。

本稿では、二進数及び十進数の浮動小数点形式と8種類の丸め形式の概要について説明します。

1.二進数及び十進数の浮動小数点形式

以前の COBOL国際規格では、以下の浮動小数点形式のみがサポートされていました。

  • FLOAT-SHORT
  • FLOAT-LONG
  • FLOAT-EXTENDED

これらのフィールドに対する大きさ及び許容値の範囲、または、データ項目の表現形式及び長さは,ベンダーが定義する仕様でした。

2014年版COBOL国際規格でサポートされた二進数及び十進数の浮動小数点形式は、 ISO/IEC 60559 (IEEE 754)の規格を反映した仕様となっています。
それぞれの浮動小数点形式の仕様は以下のとおりです。

1.1 二進浮動小数点形式

32/64/128ビットで表現する3種類の二進浮動小数点形式をサポートしました。

bit指定形式
(USAGE句)
データ項目の値0に最も近い値正の最大整数値すべての値
32FLOAT-
BINARY-32
-(2128 -2104)~
+(2128 -2104)
-(2-149)と
+(2-149)
+(224 -1)または
16,777,213
整数*
+(2-149)
64FLOAT-
BINARY-64
-(21024 -2971)~
+(21024 -2971)
-(2-1074) と
+(2-1074)
+(253 -1)または
9,007,199,254,740,991
整数*
+(21074)
128FLOAT-
BINARY-128
-(216394 -216271)~
+(216394 -216271)
-(2-16494) と
+(2-16494)
+(2113 -1)または
10,384,593,717,069,655,257,060,992,658,
440,191
整数*
+(2-16494)
1.2 十進浮動小数点形式

64/128ビットで表現する2種類の十進浮動小数点形式をサポートしました。

bit指定形式
(USAGE句)
データ項目の値0に最も近い値正の最大整数値すべての値
64FLOAT-
DECIMAL-16
-9.999 999 999 999 99*10384

+9.999 999 999 999 99*10384
-1.0*10-398

+1.0*10-398
+(1.0*1017 -1)または
9 999 999 999 999 999
整数*
1.0*10-398
128FLOAT-
DECIMAL-34
-9.999 999 999 999 999 999
999 999 999 999 999*106144

+9.999 999 999 999 999 999
999 999 999 999 999 *106144
-1.0*10-6176

+1.0*10-6176
+(1.0*1035 -1)または
9 999 999 999 999 999 999
999 999 999 999 999
整数*
1.0 *10-6176

加算、減算、乗算、除算の規則は、ISO/IEC/IEEE 60559で明示的に定義されており、COBOLでは、これらの操作について言語固有の規則に依存するのではなく、その業界標準の定義を使用します。
同様に、中間および最終丸めがどのように実行されるかに関する仕様は、ISO/IEC/IEEE 60559の対応する規則を明示的に引用するか、またはそれらを基礎として使用するかのいずれかになります。

2.8種類の丸め形式

以前の COBOL国際規格では、以下の2つの丸めのみがサポートされていました。

    • ROUNDED指定なし:0に丸める(切り捨て)
    • ROUNDED指定あり:最も近い値に丸める。2つの値の中間にある場合は0から遠い値が選択される。

    2014年版COBOL国際規格では、以下の指定方法による丸めがサポートされました。

    • DEFAULT ROUNDED句
    • INTERMEDIATE ROUNDING句
    • ROUNDED指定
    見出し部

    OPTIONS.
    DEFAULT ROUNDED句 :ROUNDED指定で丸めモードが指定されていない場合に適用される丸めルール

    INTERMEDIATE ROUNDING句 :算術文および算術式の中間結果に適用される丸めルール

    手続き部

    ROUNDED指定 :算術文および算術式の最終結果に適用される丸めルール

    中間丸めと最終丸め
    • 中間丸め
      データ項目が算術演算に含めるために検索されるとき、および算術演算の実行中に中間結果を生成するために適用されます。
      INTERMEDIATE ROUNDING句で指定できます。
    • 最終丸め
      結果が宛先に配置される直前の式または文の最終結果を生成するために適用されます。
      ROUNDED指定のMODEで指定できます。
      ROUNDED指定のMODEが指定されていない場合、DEFAULT ROUNDED句の指定が適用されます。
    丸めの形式

    以下の8種類の形式がサポートされました。

    丸めの種類指定形式説明
    最近接丸め0から遠い方へNEAREST-AWAY -FROM-ZERO最も近くの表現できる値へ丸める。
    2つの値の中間であったら、正の値ならより大きいほう、負の値ならより小さいほうの値を採用する。
    0から近い方へNEAREST-TOWARD-ZERO最も近くの表現できる値へ丸める。
    2つの値の中間であったら、正の値ならより小さいほう、負の値ならより大きいほうの値を採用する。
    偶数方向へNEAREST-EVEN最も近くの表現できる値へ丸める。
    2つの値の中間であったら、偶数の値(一番低い仮数ビットが0になるほう)を採用する。
    方向丸め0から遠い方向AWAY -FROM-ZERO0から遠い方向への丸め
    0方向TRUNCATION0方向への丸め。切り捨て
    正の無限大方向TOWARD-GREATER正の無限大方向丸め。切り上げ
    負の無限大方向TOWARD-LESSER負の無限大方向丸め。切り下げ
    丸めなしPROHIBITED内容は変更されません。


    丸めの例を以下に示します。

     +2.49-2.49+2.50-2.50+3.49-3.49+3.50-3.50+3.510-3.510
    NEAREST-AWAY-FROM-ZERO+2-2+3-3+3-3+4-4+4-4
    NEAREST-TOWARD-ZERO+2-2+2-2+3-3+3-3+4-4
    NEAREST-EVEN+2-2+2-2+3-3+4-4+4-4
    AWAY-FROM-ZERO+3-3+3-3+4-4+4-4+4-4
    TRUNCATION+2-2+2-2+3-3+3-3+3-3
    TOWARD-GREATER+3-2+3-2+4-3+4-3+4-3
    TOWARD-LESSER+2-3+2-3+3-4+3-4+3-4

    関連記事