1

次のコードでは、終了条件を次のように置き換えたいと思います: 推測二乗と x の比率が 1 に近い場合、while ループは終了する必要があります。さまざまな式を試しましたが、コードを正しく実行するものはありませんでした。なにか提案を?

# include<stdio.h>
float absolute(float x)
{
     if (x < 0)
         x = -x;
     return x;
}

float square(float x)
{
    float guess = 1;

    while(absolute(guess*guess - x) >= 0.0001 )
        guess = ((x/guess) + guess) / 2;

    return guess;
}

int main(void)
{
    printf("square root of 2 is %f\n", square(2));
    printf("square root of 3 is %f\n", square(3));
    return 0;
}
4

4 に答える 4

3

答えを見つけてください: while ステートメントは次のようになります:

 while  ( absoluteValue((guess * guess) / x  - 1.0) >= 0.0001 ) 
于 2012-12-26T09:38:16.543 に答える
2
# include<stdio.h>

double sq_root(double x)
{
    double rt = 1, ort = 0;
    while(ort!=rt)
    {
        ort = rt;
        rt = ((x/rt) + rt) / 2;
    }
    return rt;
}

int main(void)
{
    int i;
    for(i = 2; i<1001; i++) printf("square root of %d is %f\n",i, sq_root(i));
    return 0;
}
于 2013-06-22T05:29:30.757 に答える
1

推測二乗と x の比率が 1 に近い場合

では、なぜ引き算をするのでしょうか。比率演算子を使用:

while(absolute( (guess*guess) / x - 1) >= 0.0001 )
于 2012-12-26T09:28:04.960 に答える
1

その推測に到達できない可能性があります*推測はxに十分近いでしょう。たとえば、2e38 の sqrt を想像してみてください。すべての近似値は ~1e31 より近くならず、終了条件は決して成功しません。

すべてのケースに適したバリアントは、推測が変化しなくなったときにこのメソッドの停止が発生することです。だからあなたは次のようなものを書くでしょう

prev_guess = 0; // any initial value is ok
while (guess != prev_guess) {
    ...
    prev_guess = guess;
}

少なくとも、オーバーフローまたはアンダーフローに達しないIEEE754互換の実装で機能するはずです。

また、guess と prev_guess の差を比較することもできます (目標は通常、二乗された値ではなく、ルートの十分な精度に一致することです)。

于 2013-06-22T10:29:38.883 に答える