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)返します-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]。次に、ド・モアブルの式を使用して、形式で根を計算できますa + bi

于 2011-06-13T01:12:15.253 に答える
2

インターネットで入手できる多くの複素数パッケージの1つを使用するか、数値をアルガンド平面上の長方形の位置に変換し、ルートで指定された適切な角度に回転させてから、(実数、虚数)ペアとして読み取ります。 。

于 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

if(num <0){return Math.abs(Math.pow(num、1 / root))}次に、値を指定するときは常に'+"i"'を使用します。または、方程式の絶対値を使用し、後で必要に応じて正/負とiを考慮します。それが私のために働いたものです。

于 2014-02-21T04:50:38.157 に答える
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ステートメントを追加してください。の線に沿って何か

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 に答える