Java n根实现

Java n根实现,java,math,nth-root,Java,Math,Nth Root,我正在研究一种计算数字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);

我正在研究一种计算数字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);
}
publicstaticdoubleroot(doublenum,doubleroot){
if(num<0){
return-Math.pow(Math.abs(num),(1/root));
}
返回Math.pow(num,1.0/根);
}

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

使用Internet上提供的许多复数包中的一个,或者将数字转换为Argand平面上的矩形位置,旋转根给定的适当角度,然后将其作为一个矩形读取(实的,虚的)对。

你想做什么?除非你计划完全正确地处理复数,否则你不能求负数的n次方

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

要正确处理这个问题,您需要将数字转换为极坐标形式,然后在该形式中取所需的根

所以
-8
是复数
8*exp(i*pi)
。其
1/3
根是
2*exp(i*pi/3)
2*exp(i*pi)
2*exp[i*(.pi)/3]
。然后您可以使用
a+bi
(num)^(1/root)
的形式来计算根(num))
,因此您可以像这样执行:

public static double root(double num, double root)
{
    return Math.pow(Math.E, Math.log(num)/root);
} 
你可以 if(num<0){ 返回Math.abs(Math.pow(num,1/根)) } 然后只要用“+”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=x-y;
                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);
}
publicstaticdoubleroot(doublenum,doubleroot){
if(num<0){
如果(根%2==1){
return-Math.pow(Math.abs(num),(1/root));
}
}
返回Math.pow(num,1.0/根);
}

不完全确定这是否适用于您的其他代码,但我希望它能有所帮助。

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

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;
}
public双根目录(双数值,双根目录){
双d=数学功率(num,1.0/根);
长四舍五入=数学四舍五入(d);
返回Math.abs(四舍五入-d)<0.00000000000001?四舍五入:d;
}

负数的根是复杂的,java没有内置的对复数的支持-2有两个平方根。我不包括虚数。然后你可以扔掉所有负数的偶数根。请澄清它无效的原因。(26)^(1/0.8)=58.17`return Math.pow(Math.E,Math.log(num)/root);`Eng Fouad您的方法没有提供正确的答案。正确的代码应该这样写
Math.pow(Math.exp(1/root),Math.log(num));
@IliyaGino-我认为变量名
root
不是根本身,而是所需幂的倒数(例如,如果
root==2
,则调用
root)(3.0,2)
应返回3的平方根。我尝试使用您的代码,它返回1.99999998,而不是2作为4的平方根,根(4,2).如何让它返回2。Cheers@FeayJaranaManotumruksa你不能指望浮点函数给出准确的答案。这是不可能的。是的,但我们希望你能用一些英语解释你的答案。(而且你想要的是
num
,而不是
Number
)@Teepeemm我提供了一个逻辑现在由你自己提出理论,兄弟,我不是一个会向你解释一切的老师。还有,
Math.log10(num)
将因
num而失败此操作将一次计算一个数字的根,效率极低。但这将导致错误代码,因为函数不会指示其返回值是实值还是纯虚值。这对
num不起作用