ウィキペディアの情報に基づいて、数値の平方根を取得するためのバビロニア/ヘロンのメソッドをJavaで実装しています。
現在私は持っています:
public static void main(String[] args) {
System.out.println(Sqrt.sqrt1(8));
//System.out.println(Sqrt.sqrt2(8)); //Infinite loop
System.out.println(Sqrt.sqrt3(8));
System.out.println(Sqrt.sqrt4(8));
}
static float sqrt1(float x) {
float b = 0, h = x;
while (b != h) {
b = (h + b) / 2;
h = x / b;
}
return b;
}
static double sqrt2(double x) {
double b = x, h = 0;
while (b != h) {
b = (h + b) / 2;
h = x / b;
}
return b;
}
static double sqrt3(double x) {
double b = x, h = 0;
while (Math.abs(b - h) > 0.000000000001) {
b = (h + b) / 2;
h = x / b;
}
return b;
}
static double sqrt4(double x) {
double r = x, t = 0;
while (t != r) {
t = r;
r = (x / r + r) / 2;
}
return r;
}
出力は次のようになります。
2.828427
2.82842712474619
2.82842712474619
sqrt2メソッドは永久ループになりますが、sqrt1メソッドはfloatで正常に機能するため、これはdoubleでのみ発生します。なぜこれなのかわかりません。したがって、sqrt3メソッドは、doubleを使用する場合の方法のように見えます。
どのメソッドを実装するかについて少し混乱しています。¿バビロニア法は開平法と同じですか。
私が理解していることから、バビロニア法は、正方形の辺が正方形の面積(x)の平方根であるという事実に基づいています。したがって、bh寸法の長方形から始めて、2つの辺の平均(b = b + h / 2)を取得し、この結果を小さい長方形の辺と見なして、もちろん反対側(h = x)を取得できます。 / b)。長方形は、目的の正方形に近づき始めます。これは私がsqrt1、sqrt2およびsqrt3メソッドで行ったことです:
while (b != h) {
b = (h + b) / 2;
h = x / b;
}
反対側では、ウィキペディアのリンクは、バビロニア/開平法が同じであると述べており、次のように説明しています。
「基本的な考え方は、xが非負実数Sの平方根に対して過大評価されている場合、S / xは過小評価されるため、これら2つの数の平均がより良い近似を提供すると合理的に期待できるということです。」
この実装はsqrt4メソッドで確認できます。
while (t != r) {
t = r;
r = (x/r + r) / 2;
}
私が見ることができることから、この2つの方法は同じではありませんが、似ています。私が間違っている場合は私を訂正してください。
興味深いのは、私ができないことですwhile (b != h) {
。bとhが、sqrt2メソッドで示されているようにdoubleである場合、無限ループになるためです。代わりに私は使用しましたwhile (Math.abs(b - h) > 0.000000000001) {
しかし、私はできます:while (t != r) {
sqrt4に示されているようにbとhが2倍になります。
誰かがこの振る舞いを説明してくれれば幸いです。
- - - - - -編集: - - - - - - - - - - - - - - - - - - - -----------------------
提案されているように、両方のアルゴリズムは同じですが、実装が異なります。ただし、次の推奨コードは、x =8のsqrt2と同じようにループします。
static double sqrt5(double x) {
double b = x;
while (b != x/b) {
b = (x / b + b) / 2;
}
return b;
}
それで..他の実装とのsqrt4の違いは何ですか?なぜそれは他の人のように永遠にループしないのですか?