2012-05-03 13 views
1
#include<stdio.h> 
#include<stdlib.h> 
#define abs(a) ((a)>0 ? a: -a) 
#define eps_sqrt 0.00000000000001 
#define it 100 

float sqrt(float x) 
/*The Square Root Function using the Newton's Method*/ 
{ 
    int it_sqrt=0; 
    float a_sqrt = x/2; 
    while ((abs((a_sqrt*a_sqrt)-(x))>=eps_sqrt) && (2.0*a_sqrt != 0) && (it_sqrt<=it)) 
    { 
     a_sqrt = a_sqrt - ((a_sqrt*a_sqrt)-(x)/(2.0*a_sqrt)); 
     it_sqrt++; 
    } 
    return a_sqrt; 
} 

int main() 
{ 
    printf("%.5f\n", sqrt(5)); 
    system ("pause"); 
} 

私はニュートンの反復法を使ってPython上の平方根を見つけようとしましたが、うまく機能しました。 私はCで新しく、なぜこの機能がうまくいかないのか分かりません。 私はそれを実行するたびに、 "-1。#INF0A"を返します 助けていただければ幸いです。関数と浮動小数点の比較


編集:私は0.000001にEPSをCHANGINしようと、それはまた、うまくいきませんでした。

+0


に私はそれを試してみましたが、それはまだ同じ結果に –

+0

間違ったマクロ関数ABS引数を与えます。私の答えを見てください。 – BLUEPIXY

+3

あなたの自家製の 'abs'マクロを使用しないで、その引数を2回評価します。 Cライブラリには 'fabs'があります。これは通常組み込み型なので、パフォーマンスは同じですが安全です。 –

答えて

2
double mysqrt(double x){ 
    double eps=pow(10,-10); 
    double x0 = 0.0; 
    double x1 = x/2.0; 
    while(fabs(x1 - x0)>eps){ 
     x0 = x1; 
     x1 = x0 + (x - x0*x0)/x0/ 2.0; 
    } 
    return x1; 
} 

マクロ展開
abs((a_sqrt*a_sqrt)-(x))
膨張(((a_sqrt*a_sqrt)-(x))>0 ? (a_sqrt*a_sqrt)-(x): -(a_sqrt*a_sqrt)-(x))
NG:-(a_sqrt*a_sqrt)-(x)

abs((a_sqrt*a_sqrt- x))


膨張(((a_sqrt*a_sqrt- x))>0 ? (a_sqrt*a_sqrt- x): -(a_sqrt*a_sqrt- x))

書き換え
#define abs(a) ((a)>0 ? a: -a)
#define abs(a) ((a)>0 ? a: -(a))

+0

これは良いです!ありがとう! –

3

より大きなイプシロンを使用しようとします。おそらく、Pythonは浮動小数点数の代わりに倍精度を使用します。私の作品

   a_sqrt = a_sqrt - ((a_sqrt*a_sqrt - x)/(2.0*a_sqrt)); 

   a_sqrt = a_sqrt - ((a_sqrt*a_sqrt)-(x)/(2.0*a_sqrt)); 

:この行を変更する

+0

確かに。 floatのEpsilonは0.0000001(小数点以下7桁)のようになります –

4

+0

これはニュートンの方法に厳密に従いません –

+0

それはほぼ二等分方法 –

+0

であり、精度は悪い –

2

これは実際にdoubleを使用するまれなケースの1つです。フロートの精度がeps_sqrtよりも有意に低いことが 注:

[[email protected] tmp]$ cat tmp2.c 
#include <stdio.h> 
#include <math.h> 

int main() { 
    double a = sqrtl(2.0); 
    printf("%1.20f\n", a - (float) a); 
} 
[[email protected] tmp]$ gcc tmp2.c; ./a.out 
0.00000002420323430563 
vs. your value of: 
0.00000000000001 

だからあなたのプログラムは、ほとんどの場合、終了することはありません。

関連する問題