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

필자는 Newton의 반복 방법을 사용하여 파이썬에서 제곱근을 찾았으며 완벽하게 작동했습니다. 저는 C 언어에 익숙하지 않아이 기능이 왜 작동하지 않는지 이해할 수 없습니다. 실행할 때마다 "-1. # INF0A"가 반환됩니다. 도움이 될 것입니다.함수와 부동 소수점 비교


편집 : 나는 0.000001에 EPS를 바꾸는 시도하고 또한 작동하지 않았다.

+0

에 나는 그것을 시도했지만 여전히 같은 결과를 –

+0

잘못된 매크로 기능 복근 인수를 제공합니다. 내 대답을 보라. – BLUEPIXY

+3

자신의 집에서 만든 'abs' 매크로를 사용하지 않으면, 인수를 두 번 평가합니다. 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

더 큰 엡실론을 사용해보십시오. 아마도 파이썬은 수레 대신에 더블을 사용합니다.

+0

참으로. float에 대한 엡실론은 0.0000001 (소수점 7 자리)와 같아야합니다. –

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

에.

+0

하지만이 방법은 뉴턴의 방법을 엄격하게 따르지 않습니다. –

+0

대략 이분법 인 –

+0

이고 정밀도가 좋지 않습니다. –

2

double을 실제로 사용하는 경우가 드문 경우 중 하나입니다. 부동 소수점의 정밀도가 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 

그래서 프로그램이, 대부분의 경우, 종료하지 않습니다.