函数和浮点比较

时间:2012-05-03 16:01:46

标签: c function floating-point numerical-methods newtons-method

#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");
}

我尝试使用Newton的迭代方法在Python上找到平方根并且它非常有效。 我是C的新手,我不明白为什么这个功能对我不起作用。 每当我运行它时,它返回“-1。#INF0A” 任何帮助将不胜感激。


修改:我尝试将eps更改为0.000001,但也无效。

4 个答案:

答案 0 :(得分: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));

适合我。

答案 1 :(得分:3)

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

答案 2 :(得分: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

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

答案 3 :(得分: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))