我正在寻找 64 位(无符号)立方根的快速代码。(我正在使用 C 并使用 gcc 进行编译,但我认为所需的大部分工作将与语言和编译器无关。)我将用 ulong 表示一个 64 位无符号整数。
给定一个输入 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;
}