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 の場合
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