1 
2 /* Program to check that the FP stuff underlying these common FP
3    functions isn't too badly broken.  Carefully kludged to print the
4    same answers on different platforms (even when run natively). */
5 
6 #include <stdio.h>
7 #include <math.h>
8 
main(void)9 int main ( void )
10 {
11    double d;
12    float f;
13    int i;
14 
15    const double tinyD = 0.0000000001;
16    const double tinyF = 0.0001;
17 
18    /* -------------------- any arg -------------------- */
19 
20    d = -2.0;
21    for (i = 0; i < 41; i++) {
22       printf("floorD(%+20.13e) = %+20.13e\n", d, floor(d));
23       d += 0.1-tinyD;
24    }
25    f = -2.0;
26    for (i = 0; i < 41; i++) {
27       printf("floorF(%+20.4e) = %+20.4e\n", (double)f, (double)floorf(f));
28       f += 0.1-tinyF;
29    }
30 
31 
32    d = -2.0;
33    for (i = 0; i < 41; i++) {
34       printf(" ceilD(%+20.13e) = %+20.13e\n", d, ceil(d));
35       d += 0.1-tinyD;
36    }
37    f = -2.0;
38    for (i = 0; i < 41; i++) {
39       printf(" ceilF(%+20.4e) = %+20.4e\n", (double)f, (double)ceilf(f));
40       f += 0.1-tinyF;
41    }
42 
43 
44    d = -2.0;
45    for (i = 0; i < 41; i++) {
46       printf("  sinD(%+20.13e) = %+20.13e\n", d, sin(d));
47       d += 0.1-tinyD;
48    }
49    f = -2.0;
50    for (i = 0; i < 41; i++) {
51       printf("  sinF(%+20.4e) = %+20.4e\n", (double)f, (double)sinf(f));
52       f += 0.1-tinyF;
53    }
54 
55 
56    d = -2.0;
57    for (i = 0; i < 41; i++) {
58       printf("  cosD(%+20.13e) = %+20.13e\n", d, cos(d));
59       d += 0.1-tinyD;
60    }
61    f = -2.0;
62    for (i = 0; i < 41; i++) {
63       printf("  cosF(%+20.4e) = %+20.4e\n", (double)f, (double)cosf(f));
64       f += 0.1-tinyF;
65    }
66 
67 
68    d = -2.0;
69    for (i = 0; i < 41; i++) {
70       printf("  tanD(%+20.13e) = %+20.13e\n", d, tan(d));
71       d += 0.1-tinyD;
72    }
73    f = -2.0;
74    for (i = 0; i < 41; i++) {
75       printf("  tanF(%+20.4e) = %+20.4e\n", (double)f, (double)tanf(f));
76       f += 0.1-tinyF;
77    }
78 
79 
80    d = -2.0;
81    for (i = 0; i < 41; i++) {
82       printf("  expD(%+20.13e) = %+20.13e\n", d, exp(d));
83       d += 0.1-tinyD;
84    }
85    f = -2.0;
86    for (i = 0; i < 41; i++) {
87       printf("  expF(%+20.4e) = %+20.4e\n", (double)f, (double)expf(f));
88       f += 0.1-tinyF;
89    }
90 
91    /* -------------------- >= 0 arg -------------------- */
92 
93    d = 0.0;
94    for (i = 0; i < 21; i++) {
95       printf(" sqrtD(%+20.13e) = %+20.13e\n", d, sqrt(d));
96       d += 0.1-tinyD;
97    }
98    f = 0.0;
99    for (i = 0; i < 21; i++) {
100       printf(" sqrtF(%+20.4e) = %+20.4e\n", (double)f, (double)sqrtf(f));
101       f += 0.1-tinyF;
102    }
103 
104 
105    d = 0.0;
106    for (i = 0; i < 21; i++) {
107       printf("  logD(%+20.13e) = %+20.13e\n", d, log(d));
108       d += 0.1-tinyD;
109    }
110    f = 0.0;
111    for (i = 0; i < 21; i++) {
112       printf("  logF(%+20.4e) = %+20.4e\n", (double)f, (double)logf(f));
113       f += 0.1-tinyF;
114    }
115 
116 
117    d = 0.0;
118    for (i = 0; i < 21; i++) {
119       printf("log10D(%+20.13e) = %+20.13e\n", d, log10(d));
120       d += 0.1-tinyD;
121    }
122    f = 0.0;
123    for (i = 0; i < 21; i++) {
124       printf("log10F(%+20.4e) = %+20.4e\n", (double)f, (double)log10f(f));
125       f += 0.1-tinyF;
126    }
127 
128    /* -------------------- -1 .. +1 arg -------------------- */
129 
130    d = -1.0;
131    for (i = 0; i < 21; i++) {
132       printf(" asinD(%+20.13e) = %+20.13e\n", d, asin(d));
133       d += 0.1-tinyD;
134    }
135    f = -1.0;
136    for (i = 0; i < 21; i++) {
137       printf(" asinF(%+20.4e) = %+20.4e\n", (double)f, (double)asinf(f));
138       f += 0.1-tinyF;
139    }
140 
141    /* acos(double) seems very prone to accuracy loss near the end of
142       the range (arg --> +1.0).  Hence is different from the rest to
143       stop it getting so close to 1.0. */
144    d = -1.0;
145    for (i = 0; i < 21; i++) {
146       printf(" acosD(%+20.13e) = %+20.10e\n", d, acos(d));
147       d += 0.1 - 1000.0*tinyD;
148    }
149    f = -1.0;
150    for (i = 0; i < 21; i++) {
151       printf(" acosF(%+20.4e) = %+20.4e\n", (double)f, (double)acosf(f));
152       f += 0.1-tinyF;
153    }
154 
155 
156    d = -1.0;
157    for (i = 0; i < 21; i++) {
158       printf(" atanD(%+20.13e) = %+20.13e\n", d, atan(d));
159       d += 0.1-tinyD;
160    }
161    f = -1.0;
162    for (i = 0; i < 21; i++) {
163       printf(" atanF(%+20.4e) = %+20.4e\n", (double)f, (double)atanf(f));
164       f += 0.1-tinyF;
165    }
166 
167 
168    d = -1.0;
169    for (i = 0; i < 21; i++) {
170       printf("atan2D(%+20.13e) = %+20.13e\n", d, atan2(d, 1.0));
171       d += 0.1-tinyD;
172    }
173    f = -1.0;
174    for (i = 0; i < 21; i++) {
175       printf("atan2F(%+20.4e) = %+20.4e\n", (double)f, (double)atan2f(f,1.0));
176       f += 0.1-tinyF;
177    }
178 
179    return 0;
180 }
181