第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 + bi
forms的根。
(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));