예제 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 }