64 ビット (符号なし) 立方根の高速なコードを探しています。(私は C を使用しており、gcc でコンパイルしていますが、必要な作業のほとんどは言語やコンパイラに依存しないものになると思います。) 64 ビットの符号なし整数を ulong で示します。
入力 n が与えられると、(整数) 戻り値 r が次のようになる必要があります。
r * r * r <= n && n < (r + 1) * (r + 1) * (r + 1)
つまり、切り捨てられた n の立方根が必要です。のような基本的なコード
return (ulong)pow(n, 1.0/3);
範囲の終わりに向かって丸めているため、正しくありません。のような洗練されていないコード
ulong
cuberoot(ulong n)
{
ulong ret = pow(n + 0.5, 1.0/3);
if (n < 100000000000001ULL)
return ret;
if (n >= 18446724184312856125ULL)
return 2642245ULL;
if (ret * ret * ret > n) {
ret--;
while (ret * ret * ret > n)
ret--;
return ret;
}
while ((ret + 1) * (ret + 1) * (ret + 1) <= n)
ret++;
return ret;
}
正しい結果が得られますが、必要以上に遅くなります。
このコードは数学ライブラリ用であり、さまざまな関数から何度も呼び出されます。速度は重要ですが、ウォーム キャッシュを期待することはできません (したがって、2,642,245 エントリのバイナリ検索などの提案は適切です)。
比較のために、整数の平方根を正しく計算するコードを次に示します。
ulong squareroot(ulong a) {
ulong x = (ulong)sqrt((double)a);
if (x > 0xFFFFFFFF || x*x > a)
x--;
return x;
}