算術演算規則: 加算演算子
累乗 (**)、整数除算 (%)、
および剰余 (//) の各演算子の演算規則について説明します。
Power®
** (累乗) 演算子 は、数値を累乗します。これは、正、負、または 0のいずれかです。 べきは、整数でなければなりません。 (演算の 2 番目の項は整数でなければならず、必要に応じて DIGITS 桁に丸められます。これについては、 REXX によって直接使用される数値で説明されています。) 負の場合は、累乗の絶対値が使用され、結果は逆数 (1 で除算) になります。 累乗の計算では、累乗で表された回数だけ、実際にその数値を乗算し、最後に、(結果を 1 で除算した場合と同様に) 後続のゼロを除去します。
実際には、累乗は左から右への 2 進削減のプロセスによって計算されます (理由については、 1 を参照してください)。 a**nの場合: n はバイナリーに変換され、一時アキュムレーターは 1 に設定されます。 n = 0 の場合、初期計算は完了しています。 (したがって、すべての a (0**0 も含みます) に対して、
a**0=1 となります。) それ以外の場合は、各ビット (最初の非ゼロ・ビットから始めて) が、左から右へ検査されます。 現行ビットが 1 の場合、アキュムレーターに aが乗算されます。 すべてのビットが検査されると、初期計算は完了します。それ以外の場合は、アキュムレーターが二乗され、次のビットが乗算について検査されます。 初期計算が完了した時点で、累乗が負だった場合は、一時結果を 1 で除算します。
乗算および除算は、
DIGITS + L + 1 桁の精度を使用して、算術演算規則のもとで行われます。 L は、整数 n の整数部分の桁数 (すなわち、組み込み関数 TRUNC(n) を使用した場合
と同様の、小数部を除いた桁数) です。 結果は最終的には、必要であれば NUMERIC DIGITS 桁に丸められ、
意味をもたない後続ゼロは除去されます。
整数の除算
% (整数の除算) 演算子は、2 つの数で除算を行い、結果の整数部分を戻します。 戻される結果は、被除数が除数より大きい間は、被除数から除数を繰り返し 引いていき、その引いた回数として定義されます。 この減算中、被除数と除数は両方とも絶対値が使用されます。最終結果の符号は、通常の除算から得られるものと同じです。
戻される結果には小数部がありません (すなわち、小数点やそれに続くゼロはありません)。 結果を整数として表せない場合、演算はエラーとなり、失敗に終わります。すなわち、結果の桁数が NUMERIC DIGITS の現行設定値を超えてはなりません。 例えば、10000000000%3 では結果 (3333333333) を表すのに 10 桁必要と
なるので、NUMERIC DIGITS 9 が有効であったとすると、
失敗することになります。 この演算子を使用した場合、通常の除算で切り捨てを行ったときの結果と同じにならないことがあります (丸めによる影響を受けることがあります)。
リマインダー
// (剰余) 演算子は、整数の除算からの剰余を戻すもので、 前述した整数結果の除算を行った後の被除数の剰余として定義されています。 剰余 (非ゼロの場合) の符号は、元の被除数の符号と同じです。
この演算は、整数除算と同じ条件の下で失敗します (つまり、 同じ 2 つの項での整数除算が失敗すると、剰余は計算できません)。
加算演算子の例
/* Again with: Numeric digits 5 */
2**3 -> 8
2**-3 -> 0.125
1.7**8 -> 69.758
2%3 -> 0
2.1//3 -> 2.1
10%3 -> 3
10//3 -> 1
-10//3 -> -1
10.2//1 -> 0.2
10//0.3 -> 0.1
3.6//1.3 -> 1.0
- 累乗の計算では、特別なアルゴリズムが使用されています。 その理由は、このアルゴリズムが効率的 (最適ではありませんが) であり、 実際の乗算の実行回数をかなり減らすためです。 したがって、このアルゴリズムを使用すると、乗算の繰り返しという単純な定義に比べてパフォーマンスが向上します。 乗算を繰り返す場合とは結果が異なることがあるため、このアルゴリズムをここで定義しています。
- 整数の除算および剰余演算子は、標準の除算演算の副産物として計算できるように定義されています。 除算処理は、整数結果が出たときにほぼ終了です。 被除数の剰余が、剰余だからです。