Algorithm 整数n次方根

Algorithm 整数n次方根,algorithm,math,nth-root,Algorithm,Math,Nth Root,如果x'是最大整数,那么x'是y的第n个根,这样x^n就可以为给定的y存储一个最大x的表,这样x^y就不会溢出。使用这些值进行二进制搜索;这样,就不会有溢出,只要x和n具有相同的(整数)类型,就可以使用整洁的算法。对吧? 注意:对于y>32,对于32位整数,x的最大值为2。。。换句话说,表的大小与系统理解的整数位数大致相同。是否只查找整数根?或者你想知道34的第五个根是2.024。。。?还是“2”就足够了?如果你想要小数点,你必须做一些浮点或定点运算 你应该阅读,并注意它对第一个牛顿近似值的描述

如果x'是最大整数,那么x'是y的第n个根,这样x^n就可以为给定的y存储一个最大x的表,这样x^y就不会溢出。使用这些值进行二进制搜索;这样,就不会有溢出,只要x和n具有相同的(整数)类型,就可以使用整洁的算法。对吧?


注意:对于y>32,对于32位整数,x的最大值为2。。。换句话说,表的大小与系统理解的整数位数大致相同。

是否只查找整数根?或者你想知道34的第五个根是2.024。。。?还是“2”就足够了?如果你想要小数点,你必须做一些浮点或定点运算

你应该阅读,并注意它对第一个牛顿近似值的描述。如果大约0.03%的误差足够接近,我建议你用这个。您可能希望构建一个表,用于进行初始近似。这张桌子没有听起来那么大。2^32的立方根只有大约1626。你可以很容易地计算正方形,如果你能生成x^2和x^3,那么就很容易生成x^n。所以做近似是很容易的


另一种可能是自己建立一个根表,并使用某种插值。同样,如果你把平方根当作一个特例,那么这个表就不必很大。2^32的第5个根小于100,所以你说的是一个相当小的表,以获得相当大的根范围。

我认为最好的方法是使用维基百科文章中的牛顿-拉斐逊方法


可以通过输入的位长度除以
n
来计算良好的起始值。在每次迭代中,您使用整数除法进行取整。迭代直到找到一个值
x
,这样
x^n如果x^n溢出,如何存储y?我不确定我是否完全理解这个问题,因为n和y是x和x',因此x^n@Thomas我处理的是最多4字节的无符号整数。假设y是2^10,n是4。我的天真算法尝试从1到2^10的所有数字。当x为2^8时,哎呀,(2^8)^4=2^32,溢出@Ricky Bobby我在寻找最大整数x,这样x^n就是一个很好的解。内存稀疏,尽可能高效。@Patrick87您的解决方案可能不起作用,因为对于给定的n,要找到最大x,使x^n不会溢出,正如您所建议的,相当于将y设为(2^32-1),并解决我提出的原始问题。(我正在处理4字节无符号整数)@sinoTrinity:不知道你在说什么。对于4字节(比如无符号)整数,该表看起来像2->~2^16 3->~2^11,4->~2^8,…,32->2^1,>33->1。。。然后进行二进制搜索,直到达到上限。如果n是有效的32位无符号整数,选择小于给定x上限的x将确保x^y不会溢出。也许我误解了你的问题。还有,你预先计算了这个表。如果一开始不清楚,很抱歉。就像在中一样,在你的程序中使它们成为常量。而且,看起来我调用的是Y,你调用的是N,反之亦然。。。抱歉,这让人困惑。