私は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には平方根がありません。
あなたは何をしようとしているのですか?複素数を完全かつ適切に処理することを計画していない限り、負の数の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
_の形式で計算できます。
_(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平面上の数値を長方形の位置に変換し、ルートで指定された適切な角度に回転してから、(実数、虚数)ペアとして読み取ります。
以下の方法を使用します。たぶんそれは最も正確ではありませんが、私の場合はうまく機能します。
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;
}
正確なコードについてはあまりよくわかりませんが、奇数と偶数のルートを明確にするために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);
}
これが他のコードで動作するかどうかは完全にはわかりませんが、役立つと思います
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=x-y;
y=y/10;
} else {
x=x+y;
}
}
return x;
}
コンパクトではありませんが、できるだけ少ない数学関数を使用しますが、これは問題なく機能するはずです。