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”任何帮助将不胜感激。


编辑:我尝试将 eps 更改为0.000001,但也没有用。

4

4 回答 4

4

更改此行:

                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));

为我工作。

于 2012-05-03T16:09:02.003 回答
3

尝试使用更大的 epsilon,也许 python 使用双精度数而不是浮点数。

于 2012-05-03T16:04:29.100 回答
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))

于 2012-05-03T16:50:10.640 回答
2

double这是使用实际上有意义的罕见情况之一。请注意,float 的精度明显低于 eps_sqrt:

[mic@mic-nb tmp]$ cat tmp2.c
#include <stdio.h>
#include <math.h>

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

因此,在大多数情况下,您的程序永远不会终止。

于 2012-05-03T16:37:10.637 回答