더북(TheBook)

예제 3-1 곱의 역원 계산

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3
 4 /* 1.0을 중심으로 한 반복 기준점의 상한과 하한 */
 5 static double const eps1m01 = 1.0 - 0x1P-01;
 6 static double const eps1p01 = 1.0 + 0x1P-01;
 7 static double const eps1m24 = 1.0 - 0x1P-24;
 8 static double const eps1p24 = 1.0 + 0x1P-24;
 9
10 int main(int argc, char* argv[argc+1]) {
11   for (int i = 1; i < argc; ++i) {        // 커맨드 라인 인수를 처리한다.
12     double const a = strtod(argv[i], 0);  // arg -> double
13     double x = 1.0;
14     for (;;) {                            // 2의 제곱
15       double prod = a*x;
16       if (prod < eps1m01) {
17         x *= 2.0;
18       } else if (eps1p01 < prod) {
19         x *= 0.5;
20       } else {
21         break;
22       }
23     }
24     for (;;) {                           // 헤론의 근사 공식
25       double prod = a*x;
26       if ((prod < eps1m24) || (eps1p24 < prod)) {
27         x *= (2.0 - prod);
28       } else {
29         break;
30       }
31     }
32     printf("heron: a=%.5e,\tx=%.5e,\ta*x=%.12f\n",
33            a, x, a*x)
34   }
35   return EXIT_SUCCESS;
36 }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.