6

次の除算をすばやく実行する方法を探しています。

  • 被除数は符号付き 64 ビット整数です。
  • 除数は符号付き 32 ビット整数です。
  • 商は符号付き 64 ビット整数である必要があり、剰余は必要ありません。
  • 被除数の下位 dword はゼロです。

コンパイラは 64 ビット データ型を十分にサポートしておらず、アセンブリもサポートしていないため、32 ビット データ型のみを使用しています。速度を優先するために、精度が多少損なわれる可能性があります。

これに関する指針はありますか?

4

1 に答える 1

2

64/32 除算は、被除数の上位ワードが除数よりも小さい (つまり、被除数が 32x32->64 に除数を掛けた範囲内にある) 限り、i386 や他のマシンで直接サポートされます。コンパイラが 64 ビット型を最小限しかサポートしていない場合は、この状況を認識して利用できる可能性があります。

生成された asm を既にチェックしており、これを利用していないことがわかっている場合、または CPU にそのような除算命令がないことがわかっている場合は、小学校で学んだように長い除算を行う必要があります。 base-10 ではなく base-4294967296 であることを除いて。

libgccネイティブ サポートを持たないマシン用の 64/64 分割のコードが含まれているため、ソースを に読んでみてください。

編集: 実際には、64/32 除算操作がないため、base-65536 を使用することをお勧めします。これは、単純な長い除算では、各ステップで「2 桁」の数値を「1 桁」の数値で除算する必要があるためです。もちろん、今、あなたはさらに多くのステップを実行するのに行き詰まっています..

于 2010-08-13T06:58:04.527 に答える