web-dev-qa-db-ja.com

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_を返しますが、-2には平方根がありません。

20
Will

あなたは何をしようとしているのですか?複素数を完全かつ適切に処理することを計画していない限り、負の数の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 'formula を使用して、ルートを_a + bi_の形式で計算できます。

9
QuantumMechanic

_(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);
} 
_
15
Eng.Fouad

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

以下の方法を使用します。たぶんそれは最も正確ではありませんが、私の場合はうまく機能します。

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;
}
1
Pavel Kataykin

正確なコードについてはあまりよくわかりませんが、奇数と偶数のルートを明確にするために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);
}

これが他のコードで動作するかどうかは完全にはわかりませんが、役立つと思います

0

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

0
user3312489
    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;
    }   

コンパクトではありませんが、できるだけ少ない数学関数を使用しますが、これは問題なく機能するはずです。

0
Alexis Labat