質問
私はnを計算する方法に取り組んでいますth 数字のルート。しかし、私はnに問題がありますth 負の数の根。
ほとんどの人は使用すると言います 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番目のルートを取得することはできません。
たとえば、while (-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
.
他のヒント
(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;
}
(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;
}
これはあなたのために正常に動作するはずですが、コンパクトではありませんが、可能な限り少ない数学機能を使用します。
正確なコードについてはあまり確信がありませんが、奇妙なコードと偶数のルーツの間で明確にするための追加の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);
}
これがあなたの他のコードで機能するかどうかは完全にはわかりませんが、私はそれが役立つことを願っています
system.out.println(math.pow(10、math.log10(number)/root));