【发布时间】:2011-07-10 13:17:48
【问题描述】:
以下是计算整数平方根的简单方法:
int isqrt(int num)
{
int root=0;
int b = 0x8000;
int a=0, c=0;
while (b) {
c = a|b;
if (c*c <= num)
a |= b;
b >>= 1;
}
}
巧妙地(感谢Wikipedia),可以这样优化:
int sqrt(short num)
{
int op = num;
int res = 0;
int one = 1 << 30;
while (one > op)
one >>= 2;
while (one != 0) {
if (op >= res + one) {
op -= res + one;
res = (res >> 1) + one;
}
else
res >>= 1;
one >>= 2;
}
return res;
}
我的问题:可以为整数立方根编写类似优化的算法吗? (这是在一个不喜欢做乘法的小型微控制器上运行的)
【问题讨论】:
-
我不知道,但是您可以通过添加 7、19、37、61 等来生成连续整数的三次方,您可以通过添加 12、18、24、30 来获得这些数字, 36 等。它不是特别聪明或快速,但考虑到 2^32 的整数立方根仍然只有 1625,它不应该进行那么多迭代(所有迭代都包括几个加法和比较,没有 mults)。编辑:所以事实证明有一种方法。很高兴知道!
-
是的,算法可以扩展到立方根,即使没有乘法。请参阅此代码:hackersdelight.org/HDcode/icbrt.c.txt 并考虑购买他的代码来自的书 Hackers Delight。如果您每年必须经常解决此类问题,那么您绝对应该阅读它!
标签: algorithm math optimization