20

我正在研究一种计算数字的第 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)return -1.41421,但 -2 没有平方根。

4

8 回答 8

17

(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);
} 
于 2011-06-13T01:30:28.083 回答
10

你想做什么?除非您打算完全正确地处理复数,否则您不能取负数的第 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]。然后您可以使用de Moivre' 公式计算形式中的根a + bi

于 2011-06-13T01:12:15.253 回答
2

要么使用 Internet 上提供的众多复数包之一,要么将您的数字转换为 Argand 平面上的矩形位置,将其旋转到根给定的适当角度,然后将其作为(实数,虚数)对读出.

于 2011-06-13T01:11:59.043 回答
2

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

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;
}
于 2018-09-11T21:17:51.930 回答
0
    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;
    }   

这对你来说应该很好,虽然它并不紧凑,它使用尽可能少的数学函数。

于 2015-04-12T06:29:59.610 回答
0

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

于 2014-02-21T04:50:38.157 回答
0

我不太确定确切的代码,但添加一个额外的 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);
}

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

于 2016-10-27T01:17:23.553 回答
-2

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

于 2015-07-23T11:23:36.180 回答