1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
double pi = 0; for (int k = 0; k <= 25; k++) { double delta = ((Math.Pow((-1), k)) / (Math.Pow(2, (10 * k)))) * (-(Math.Pow(2, 5) / ((4 * k) + 1.0)) - (1.0 / ((4 * k) + 3)) + (Math.Pow(2, 8) / ((10 * k) + 1.0)) - (Math.Pow(2, 6) / ((10 * k) + 3.0)) - (Math.Pow(2, 2) / ((10 * k) + 5.0)) - (Math.Pow(2, 2) / ((10.0 * k) + 7)) + (1 / ((10 * k) + 9.0))); delta /= (Math.Pow(2, 6)); pi += delta; Console.WriteLine(string.Format("k={0}, delta={1}, pi={2}", k, delta, pi)); } |
C++ 코드입니다. k가 4만 되어도 3.14159265358979가 나오네요… 소름;; 빠진 헤더나 main 함수 등은 알아서~
1학년 1학기 객체지향 프로그래밍 I에서 중간고사로 나왔던 라이프니츠의 pi 구하는 공식… 수렴 속도가 너무 느리다고 알려져 있습니다. k가 80000은 넘어야 3.1416 근처가 나옵니다…
팁으로 라이프니츠의 급수를 이용한 코드를 아래에 적어두겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ double pi=0; double temp=0; double caseodd=0; double caseeven=0; int calc=0; double k=0; double l=0; cout << endl << "파이 계산을 시작합니다. " << endl; k = 3; l = 5; for ( calc = 1 ; calc <= LIMIT ; calc++) { if (calc%2 == 1) { caseodd = caseodd - (1/k); k = k + 4; } else if (calc%2 == 0) { caseeven = caseeven + (1/l); l = l + 4; } } temp = caseodd + caseeven; pi = 4*(1+temp); cout << "π = "<< pi << endl; } |
LIMIT는 const를 쓰든 #define을 쓰든 알아서…