大きな整数 (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 が割り切れない場合、非整数を返すため、バグがあることが簡単にわかります。
私の実装のエラーは何ですか?