DECFLOAT の一般算術演算規則

DECFLOAT データ・タイプに関するすべての算術演算に対して、特定の一般規則が適用されます。

DECFLOAT データ・タイプに関する算術演算には、以下の一般規則が適用されます。

  • 有限数に関する演算は、可能な場合は係数に対して整数算術計算を使用して、厳密な数学的結果を計算する場合と同様に行われます。

    理論的な厳密な結果の係数が、その精度 (16 または 34) に相当する桁数以下の場合、変更せずにそれが結果として使用されます (アンダーフロー条件またはオーバーフロー条件がない場合)。係数がその精度に相当する桁数を超えている場合、係数は精度 (16 または 34) に相当する桁数ちょうどに丸められ、指数が除去された桁数だけ増やされます。

    CREATE VIEW 以外の静的 SQL ステートメントの場合、ROUNDING バインド・オプションまたはネイティブ SQL プロシージャーのオプションが丸めモードを決定します。

    動的 SQL ステートメント (および静的 CREATE VIEW ステートメント) の場合、特殊レジスター CURRENT DECFLOAT ROUNDING MODE が丸めモードを決定します。

    結果の調整された指数の値が Emin より小さい場合、例外条件が戻されます。このケースでは、計算された係数と指数が、結果を形成します。ただし、指数の値が Etiny より小さい場合はその限りではありません。その場合 (小さい場合) には、指数は Etiny に設定され、指数の調整に一致するように係数が丸められ (場合によってはゼロに)、符号は変更されません。この丸めによって不正確な結果になった場合、アンダーフロー例外条件が戻されます。

    結果の調整された指数の値が Emax より大きい場合、オーバーフロー例外条件が戻されます。このケースでは、結果はオーバーフロー例外条件として定義され、無限大になる可能性があります。これは、理論的結果と同じ符号を持ちます。

  • 特殊値の無限大を使用する算術計算は、通常の規則に従います。つまり、負の無限大はすべての有限数より小さく、正の無限大はすべての有限数より大きいと見なされます。

    この規則のもとでは、無限大の結果は常に厳密です。無限大の特定の使用は、無効演算条件を戻します。 以下のリストは、無効演算条件が生じる可能性がある演算を示しています。オペランドの 1 つが無限大であるが、他方のオペランドが NaN でも sNaN でもない場合、演算の結果は NaN です。

    • 加算または減算演算時に、+無限大を -無限大に加算する
    • 0 に +無限大または -無限大を乗算する
    • +無限大または -無限大を +無限大または -無限大で除算する
    • MOD 関数の被除数が +無限大または -無限大である
    • QUANTIZE 関数のどちらかの引数が +無限大または -無限大である
    • POWER™ 関数の 2 番目の引数が +無限大または -無限大である
    • シグナル NaNs が算術演算へのオペランドとして使用された場合

    以下の算術計算規則は、算術演算および NaN 値に適用されます。

    • NaN (静止 NaN またはシグナル NaNs) のオペランドを持つ算術演算の結果は NaN です。結果の符号は、シグナル NaN である第 1 オペランドからコピーされます。どちらのオペランドもシグナル NaN でない場合、符号は NaN である第 1 オペランドからコピーされます。結果が NaN の場合は常に、結果の符号はコピーされたオペランドによってのみ決定されます。
    • 乗算または除算の結果の符号が負になるのは、オペランドが異なる符号を持っており、どちらも NaN でない場合に限られます。
    • 加算または減算の結果の符号が負になるのは、結果がゼロより小さく、どちらのオペランドも NaN でない場合に限られます。ただし、以下のケースは例外で、この場合、結果は負の 0 になります。
      • 結果がゼロに丸められ、丸める前の値が負の符号を持っていた場合
      • 0 から -0 を減算した場合
      • 反対の符号を持つオペランドの加算 (または、同じ符号を持つオペランドの減算) で、結果の係数が 0、丸めモードが ROUND_FLOOR の場合
      • 乗算または除算において、結果の係数が 0 で、オペランドの符号が異なる場合
      • POWER 関数の最初の引数が -0 で、2 番目の引数が正の奇数の場合
      • CEIL、FLOOR、または SQRT 関数の引数が -0 の場合
      • ROUND または TRUNCATE 関数の引数が -0 の場合
特殊 DECFLOAT 値を含む例:
   INFINITY + 1             = INFINITY
   INFINITY + INFINITY      = INFINITY
   INFINITY + -INFINITY     = NAN        -- 例外
   NAN + 1                  = NaN
   NAN + INFINITY           = NaN
   1 - INFINITY             = -INFINITY
   INFINITY - INFINITY      = NAN        -- 例外
   -INFINITY - -INFINITY    = NAN        -- 例外
   -0.0 - 0.0E1             = -0
   -1.0 * 0.0E1             = -0
   1.0E1 / 0                = INFINITY
   -1.0E5 / 0.0             = -INFINITY
   1.0E5 / -0               = -INFINITY
   INFINITY / -INFINITY     = NAN        -- 例外
   INFINITY / 0             = INFINITY
   -INFINITY / 0            = -INFINITY
   -INFINITY / -0           = INFINITY