大きな整数 (128 ビット) を処理できる除算アルゴリズムが必要です。ビットシフト演算子を介してそれを行う方法をすでに尋ねました。ただし、私の現在の実装では、より良いアプローチが必要なようです
基本的に、数字を 2long long unsigned int
の形式で保存します
A * 2 ^ 64 + B
とB < 2 ^ 64
。
この数は で割り切れる24
ので、 で割りたいです24
。
私の現在のアプローチは、それを次のように変換することです
A * 2 ^ 64 + B A B
-------------- = ---- * 2^64 + ----
24 24 24
A A mod 24 B B mod 24
= floor( ---- ) * 2^64 + ---------- * 2^64 + floor( ---- ) + ----------
24 24.0 24 24.0
ただし、これはバグです。
(floor はA / 24
であり、mod
はであることに注意してくださいA % 24
。通常の除算は に格納されlong double
、整数は に格納されlong long unsigned int
ます。
24
はバイナリで等しいので11000
、2 番目の被加数は 4 番目の加数の範囲内で何かを変更してはなりません。これは、64 ビット左にシフトされるためです。
したがって、A * 2 ^ 64 + B
が 24 で割り切れ、B が割り切れない場合、非整数を返すため、バグがあることが簡単にわかります。
私の実装のエラーは何ですか?