定数による除算
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/05/26 11:07 UTC 版)
「除算 (デジタル)」の記事における「定数による除算」の解説
定数を除数とする除算は、その定数の逆数との乗算と等価である。そのため、除数 D がコンパイル時にわかっている場合(定数の場合)、その逆数 (1/D) をコンパイル時に計算すれば、N·(1/D) という乗算のコードを生成すればよいということになる。浮動小数点数の計算であれば、そのまま適用できる。 整数の場合は、一種の固定小数点数による計算に変形する手法がある。まず、算術的に考えてみる。例えば、除数が3の場合、2/3、4/3、256/3などのどれかを使って乗算し、しかる後に2や4や256で除算すればよい。2進法であれば除算はシフトするだけで良い(16ビット×16ビット=32ビットのような、倍長で演算結果が全て得られる計算機なら、運が良ければ上位16ビットにそのまま解が得られるようにすることもできる)。 これを整数演算でおこなう場合は、256/3は当然正確な整数にはならないので、誤差があらわれる。しかし、シフト幅をより大きくし、値の範囲に注意すれば、常に不正確な部分はビットシフトによって捨てられるように変形できることがある。 具体例として32ビットの符号なし整数で、除数が3の場合 2863311531 / 2 33 {\displaystyle 2863311531/2^{33}} との乗算に変換できる。まず 2863311531 との乗算を行い、その後33ビット右シフトする。この値は正確には 1 / 2.999999999650754 {\displaystyle 1/2.999999999650754} である。 場合によっては、定数による除算を一連のシフト操作と加減算に変換できることもある。特に興味深いのは10による除算で、シフトと加減算で正確な商(と必要なら余り)が得られる。
※この「定数による除算」の解説は、「除算 (デジタル)」の解説の一部です。
「定数による除算」を含む「除算 (デジタル)」の記事については、「除算 (デジタル)」の概要を参照ください。
- 定数による除算のページへのリンク