1

これは、数値を要求し、Math.sqrt() メソッドを使用せずにその平方根を出力する Java コードです。

import java.util.Random;
import java.io.*;
public class Square {
    public static void main(String[] args) throws IOException {
        final double TOL = 0.5E-15;
        InputStreamReader reader = new InputStreamReader(System.in);
        BufferedReader input = new BufferedReader(reader);
        System.out.print("Enter a number to get the aquare of it: ");
        double n = new Double(input.readLine()).doubleValue();
        Random random = new Random();
        double x = random.nextDouble();
        do {
            x = (x+n/x)/2;
        } while(Math.abs(x*x-n)>TOL*2*x);
        System.out.println("sqrt(" + n + ") = " + x);
    }
 }

これをコンピュータで実行し、いくつかの数値でテストしてください。30.1 未満の数値の場合は、実行して平方根をすばやく計算します。しかし、30.2 以上の数値を入力すると、平方根は計算されません (少なくとも実行可能な待機では)! この動作について興味深い説明はありますか?!

4

5 に答える 5

4

do-while を次のように変更します。

do {
    x = (x+n/x)/2;
    System.out.println(x);
    System.out.println(x*x);
} while(Math.abs(x*x-n)>TOL*2*x);

これは繰り返し与えます (入力 30.2 の場合):

5.495452665613634
30.199999999999992

ご覧のとおり、5.495452665613634 30.199999999999992 の 2 乗です。これにより、条件Math.abs(x*x-n)>TOL*2*xは常に満たされます (違いは7.105427357601002E-15. ですが、条件は> 5.4954526656136345E-15であり、これは真です) 。

言い換えれば、コンピュータプログラムが値を格納するためのいくつかの制限を持っていることを忘れているか、TOL が十分に高くないということです。

于 2013-07-31T15:27:24.510 に答える
2

コード全体は、ある時点で x の正しい値が得られるという前提で構築されています。Random オブジェクトから得られるものは、選択した数値のサイズと同様に時間に影響します。

sqrt を計算する効率的な方法ではありません。

于 2013-07-31T15:30:40.957 に答える