第n个根实现

我正在研究计算数字的第n 根的方法。 但是,我遇到了负数的 n 根问题。

大多数人都说使用Math.pow(num, 1 / root) ,但这对负数不起作用。

我试过这个:

 public static double root(double num, double root) { if (num < 0) { return -Math.pow(Math.abs(num), (1 / root)); } return Math.pow(num, 1.0 / root); } 

但是,它不适用于所有数字,因为根可以是小数。 例如, root(-26, 0.8)返回-58.71 ,但这是无效输入。 即使是根也会给出错误的答案。 例如, root(-2, 2) -1.41421 root(-2, 2)返回-1.41421 ,但-2没有平方根。

你想做什么? 除非您计划完全正确地处理复数,否则不能取负数的第n个根。

例如,虽然(-8)^(1/3)具有-2的主分支,但是(-4)^(1/2)的唯一分支是2i-2i

要正确处理这个问题,您需要将数字转换为极坐标forms,然后以该forms获取所需的根。

所以-8是复数8*exp(i*pi) 。 其1/3根是2*exp(i*pi/3)2*exp(i*pi)2*exp[i*(-pi)/3] 。 然后你可以使用de Moivre’公式来计算a + biforms的根。

(num) ^ (1/root)类似于exp( (1/root) * log(num) ) ,所以你可以这样做:

 public static double root(double num, double root) { return Math.pow(Math.E, Math.log(num)/root); } 

要么使用互联网上可用的许多复杂数字包中的一个,要么将你的数字转换为Argand平面上的矩形位置,将其旋转到根所给出的适当角度,然后将其作为(实,虚)对读出来。

你可以做if(num <0){return Math.abs(Math.pow(num,1 / root))}然后只要说明值就使用'+“i”'。 或者使用方程的绝对值,然后在需要时使用正/负和i的因子。 这对我有用。

  public double root(double num, double root) { double y=1; double x; while(Math.pow(x, root) != num) { if(Math.pow(x, root) > num) { x=xy; y=y/10; } else { x=x+y; } } return x; } 

这应该适合你,虽然它不紧凑,它尽可能少使用数学函数。

我对确切的代码不太确定,但添加一个额外的if语句以澄清奇数和偶数根之间。 一些东西

 public static double root(double num, double root) { if (num < 0) { if(root%2==1) { return -Math.pow(Math.abs(num), (1 / root)); } } return Math.pow(num, 1.0 / root); } 

不完全确定这是否适用于您的其他代码,但我希望它可以提供帮助

我使用下面的方法。 也许它不是最准确的,但在我的情况下效果很好。

 public double root(double num, double root) { double d = Math.pow(num, 1.0 / root); long rounded = Math.round(d); return Math.abs(rounded - d) < 0.00000000000001 ? rounded : d; } 

System.out.println(Math.pow(10,Math.log10(Number)/ root));