除算を使用せずに、正の実数の逆数を計算したかったのです。ニュートンラフソン法のさまざまなページを読んだ後、逆数を計算するために次のコードを実装しました。
#define PRECISION 0.1e-5
double inverse(double num) {
double ans = num;
while (ans * num > 1 + PRECISION || ans * num < 1 - PRECISION) {
ans = ans * (2 - num * ans);
}
return ans;
}
さて、問題は、私は実際には逆の値を取得しないということです。ループは無限に続きます。
それで、私が最初に気づいたのは、の値が負になるということでした。私は、常に正のままであるようにans
ステートメントを追加しました。if (ans < 0) ans *= -1;
ans
注意すべき2番目のポイント:の初期化の場合、=ans = 0.5
のいくつかの値に対して正しい答えが得られます。num
(1, 2, 3, 5)
したがって、私の仮定は、変数の不適切な初期化のために実装が機能していないということですans
。
それで、最後に私の質問:
1 。この方法を実際に使用して、すべての正の実数の逆数を計算できますか?
2.はいの場合、ニュートンラフソン法を使用するときに想定される初期値に必要な条件はありますか?
3.除算を使用せずに逆数を計算する他のより良い方法はありますか?
編集:
答えてくれてありがとう。それで、答えで述べたように、私はtoの初期値を変更しました、ans
そしてPRECISION
それは機能します!また、初期値はの特定の最大制限に適しているためnum
、ans
負になることはありません。したがって、最初に追加した負のチェック条件は必要ありません。
だから、これは動作するコードです(少なくとも私が与えた入力に対して動作します)。
double inverse(double num) {
// Added to make it valid for all inputs.
// For a too large number under the precision constraint, the answer is 0.
if (num > 999999)
return 0;
double ans = PRECISION;
while (ans * num > 1 + PRECISION || ans * num < 1 - PRECISION) {
ans = ans * (2 - num * ans);
}
return ans;
}