1

宿題の期限が迫っていますが、ループに問題があります。最初に、すでに実行できるループを介して、次に高い平方根と最小の平方根を見つける必要があります。次に、整数の次に高い平方根と最も低い平方根を平均することによって、平方根の近似値を取得する必要があることが課題からわかります。次に、ユーザーに精度の小数点以下の桁数を尋ねる必要があります。以下は課題からの引用です。

次に、カウント制御ループを構築する必要があります。目的の小数点以下の桁数ごとに 1 回実行されます。この例では、このループは 4 回実行されます (10 分の 1、100 分の 1、1000 分の 1、および 1 万分の 1 の小数点以下の桁数ごとに 1 回ずつ)。decimalPosition などのカウンターを使用して、ループがオンになっているパスを追跡します。

これは私が問題を抱えている場所です。ユーザーが入力した小数点以下の桁数に基づいて while ループを使用していますが、私のループはループを完了しません。私はプログラミングが初めてなので、これが本当に単純な場合はご容赦ください。これが私のwhileコードです:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }

}

ここに私の出力があります

Enter a number you wish to know the square root of: 8
Enter the number of decimal places of accuracy you want: 7
Find the square root of 8 to 7 decimal places: 
2.6000000
2.7000000
2.8000000
2.9000000
2.9000000 square root of 8.0000000
4

2 に答える 2

4

これはニュートン法と呼ばれ、その収束は 2 次です。それはあなたがそれを理解するのを助けるはずです.

PS - バビロニア人が最初にそれを発見しましたが、ニュートンがその功績を認められています。

于 2012-09-19T01:01:00.387 に答える
0

ループを機能させるには、ステートメントを追加できます

baseRoot = baseRoot + (pow((.1),decimalPosition));

baseRoot各繰り返しの前に答えよりも大きいことを確認する必要があるため、while ループの後。このような:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }
    baseRoot = baseRoot + (pow((.1),decimalPosition));
}

これで答えを得ることができます2.8284271

ところで、この種の問題 (単調関数に関連する) を数学をあまり使わずに解決するために、二分法(二分探索に類似) と呼ばれる別の効率的な方法があります。

double mySqrt(double x, double epsilon) {
    double left = 0, right = x;
    while (right - left > epsilon) {
        double mid = (left + right) / 2;
        if (mid * mid > x) {
            right = mid;
        } else {
            left = mid;
        }
    }
    return left;
}

それは簡単です、ばかげています:)

于 2012-09-20T05:55:31.983 に答える