2017-03-26 6 views
0

나는 C++을 배우고 있으며, pi (link : https://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_algorithm)를 근사화하기 위해 위키 백과에서 Gauss-Legendre 알고리즘을 발견했습니다. C++로 구현하려고했지만 결과가 나오지 않습니다. 다음은 코드입니다 : 내가 도움을 검색하면왜 Gauss Legendre 알고리즘을 C++로 구현해도 결과가 나오지 않습니까?

#include <iostream.h> 
#include <conio.h> 
#include <math.h> 
#include <iomanip.h> 
int main() 
    { 
     clrscr(); 
     long double a0 = 1, 
       b0 = 1/sqrt(2), 
       t0 = 1/4, 
       p0 = 1, 
       an, bn, pn, tn; 
    int i = 0; 
    while(i < 3) 
    { 
     an = (a0 + b0)/2; 
     bn = sqrt(a0 * b0); 
     tn = t0 - (p0 * (pow((a0 - an), 2))); 
     pn = 2 * p0; 
     a0 = an; 
     b0 = bn; 
     t0 = tn; 
     p0 = pn; 
    } 
    long double pi = (pow((an + bn), 2))/(4 * tn); 
    cout<<pi; 
    getch(); 
    return 0; 
    } 

내가 이걸 발견하지만, 나에게 다른 알고리즘 것 - gauss-legendre in c++

UPDATE : i 증가 프로그램이 잘못된 결과를 제공 추가 한 후합니다.

+0

구체적으로 작성하십시오. – Alex

+0

이 링크를 참조 할 수 있습니다. https://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_algorithm –

답변

0

while 루프 변수가 업데이트되지 않는다는 사실과 함께 실수로 실수가 두 번 선언되었습니다. 게으른 경우 "1/4"와 같이 double을 선언하면 "1.0/4.0"또는 "1/4.0"으로 쓰는 것이 좋습니다.

이유는 C/C++에서 정수에서 "/"연산자를 실행하고 사실 이후에 형식 변환을 수행하기 때문입니다. 본질적으로 t0 = 0 (자신을 확인할 수 있음).

다음은 몇 가지 수정 사항을 추가 한 코드로, 반복되는 각 루프에서 완전한 배정 밀도를 인쇄합니다.

#include <iostream> 
#include <cmath> 
#include <limits> 

int main() 
{ 
    long double a0=1.0, b0 = 1/sqrt(2), 
    t0 = 1.0/4.0, p0 = 1.0; 
    long double an,bn,pn,tn; 
    int i = 0; 
    long double pi; 
    typedef std::numeric_limits<double> dbl; 
    std::cout.precision(dbl::max_digits10); 
    while(i < 4) 
    { 
     an = (a0 + b0)/2.0;  
     bn = sqrt(a0 * b0); 
     tn = t0 - (p0 * (a0-an)*(a0-an)); 
     pn = 2*p0; 
     a0 = an,b0 = bn,p0 = pn,t0 = tn; 

     pi = (an+bn)*(an+bn)/(4*tn); 
     std::cout << pi << std::endl;  
     i++; 
    } 
    return 0; 
} 
1

while 루프에서 i을 증가시키지 마십시오.

+0

이제 잘못된 출력이 생성됩니다. –

+0

@YuvraajSinghJadon, 디버깅을 시도 했습니까? – Alex

-1

편집 : 1. add line i ++; 2. 변경이 TN 상기

while(i < 3) 
{ 
    an = (a0 + b0)/2; 
    bn = sqrt(a0 * b0); 
    tn = t0 - (p0 * (pow((a0 - an), 2))); 
    pn = 2 * p0; 
    a0 = an; 
    b0 = bn; 
    t0 = tn; 
    p0 = pn; 
} 

while(i < 3) 
{ 
    an = (a0 + b0)/2; 
    bn = sqrt(a0 * b0); 
    pn = 2 * p0; 
    tn = t0 - (p0 * (pow((a0 - an), 2))); 
    a0 = an; 
    b0 = bn; 
    t0 = tn; 
    p0 = pn; 
    i++; 
} 

--to 장소 PN을 code--.

+0

이전에 같은 대답을했습니다. – Alex

+0

이제 새 코드로 다시 확인하여 잘못된 출력 –

+0

을 생성합니다. –