#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
,但也无效。
答案 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))