1 | #include <float.h> |
2 | #include <stdio.h> |
3 | #include <stdlib.h> |
4 | #include <string.h> |
5 | |
6 | #ifndef DECIMAL_DIG |
7 | # define DECIMAL_DIG 21 |
8 | #endif |
9 | |
10 | |
11 | static int |
12 | do_test (void) |
13 | { |
14 | unsigned short int xs[3] = { 0x0001, 0x0012, 0x0123 }; |
15 | unsigned short int lxs[7]; |
16 | unsigned short int *xsp; |
17 | int result = 0; |
18 | long int l; |
19 | double d; |
20 | double e; |
21 | |
22 | /* Test srand48. */ |
23 | srand48 (seedval: 0x98765432); |
24 | /* Get the values of the internal Xi array. */ |
25 | xsp = seed48 (seed16v: xs); |
26 | if (xsp[0] != 0x330e || xsp[1] != 0x5432 || xsp[2] != 0x9876) |
27 | { |
28 | puts (s: "srand48(0x98765432) didn't set correct value" ); |
29 | printf (format: " expected: { %04hx, %04hx, %04hx }\n" , 0x330e, 0x5432, 0x9876); |
30 | printf (format: " seen: { %04hx, %04hx, %04hx }\n" , xsp[0], xsp[1], xsp[2]); |
31 | result = 1; |
32 | } |
33 | /* Put the values back. */ |
34 | memcpy (xs, xsp, sizeof (xs)); |
35 | (void) seed48 (seed16v: xs); |
36 | |
37 | /* See whether the correct values are installed. */ |
38 | l = lrand48 (); |
39 | if (l != 0x2fed1413l) |
40 | { |
41 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
42 | __LINE__ - 4, 0x2fed1413l, l); |
43 | result = 1; |
44 | } |
45 | |
46 | l = mrand48 (); |
47 | if (l != -0x5d73effdl) |
48 | { |
49 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
50 | __LINE__ - 4, -0x5d73effdl, l); |
51 | result = 1; |
52 | } |
53 | |
54 | l = lrand48 (); |
55 | if (l != 0x585fcfb7l) |
56 | { |
57 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
58 | __LINE__ - 4, 0x585fcfb7l, l); |
59 | result = 1; |
60 | } |
61 | |
62 | l = mrand48 (); |
63 | if (l != -0x61770b8cl) |
64 | { |
65 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
66 | __LINE__ - 4, -0x61770b8cl, l); |
67 | result = 1; |
68 | } |
69 | |
70 | /* Test seed48. The previous call should have install the values in |
71 | the initialization of `xs' above. */ |
72 | xs[0] = 0x1234; |
73 | xs[1] = 0x5678; |
74 | xs[2] = 0x9012; |
75 | xsp = seed48 (seed16v: xs); |
76 | if (xsp[0] != 0x62f2 || xsp[1] != 0xf474 || xsp[2] != 0x9e88) |
77 | { |
78 | puts (s: "seed48() did not install the values correctly" ); |
79 | printf (format: " expected: { %04hx, %04hx, %04hx }\n" , 0x62f2, 0xf474, 0x9e88); |
80 | printf (format: " seen: { %04hx, %04hx, %04hx }\n" , xsp[0], xsp[1], xsp[2]); |
81 | result = 1; |
82 | } |
83 | |
84 | /* Test lrand48 and mrand48. We continue from the seed established |
85 | above. */ |
86 | l = lrand48 (); |
87 | if (l != 0x017e48b5l) |
88 | { |
89 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
90 | __LINE__ - 4, 0x017e48b5l, l); |
91 | result = 1; |
92 | } |
93 | |
94 | l = mrand48 (); |
95 | if (l != -0x1485e05dl) |
96 | { |
97 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
98 | __LINE__ - 4, -0x1485e05dl, l); |
99 | result = 1; |
100 | } |
101 | |
102 | l = lrand48 (); |
103 | if (l != 0x6b6a3f95l) |
104 | { |
105 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
106 | __LINE__ - 4, 0x6b6a3f95l, l); |
107 | result = 1; |
108 | } |
109 | |
110 | l = mrand48 (); |
111 | if (l != 0x175c0d6fl) |
112 | { |
113 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
114 | __LINE__ - 4, 0x175c0d6fl, l); |
115 | result = 1; |
116 | } |
117 | |
118 | /* Test lcong48. */ |
119 | lxs[0] = 0x4567; |
120 | lxs[1] = 0x6789; |
121 | lxs[2] = 0x8901; |
122 | lxs[3] = 0x0123; |
123 | lxs[4] = 0x2345; |
124 | lxs[5] = 0x1111; |
125 | lxs[6] = 0x2222; |
126 | lcong48 (param: lxs); |
127 | |
128 | /* See whether the correct values are installed. */ |
129 | l = lrand48 (); |
130 | if (l != 0x6df63d66l) |
131 | { |
132 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
133 | __LINE__ - 4, 0x6df63d66l, l); |
134 | result = 1; |
135 | } |
136 | |
137 | l = mrand48 (); |
138 | if (l != 0x2f92c8e1l) |
139 | { |
140 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
141 | __LINE__ - 4, 0x2f92c8e1l, l); |
142 | result = 1; |
143 | } |
144 | |
145 | l = lrand48 (); |
146 | if (l != 0x3b4869ffl) |
147 | { |
148 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
149 | __LINE__ - 4, 0x3b4869ffl, l); |
150 | result = 1; |
151 | } |
152 | |
153 | l = mrand48 (); |
154 | if (l != 0x5cd4cc3el) |
155 | { |
156 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
157 | __LINE__ - 4, 0x5cd4cc3el, l); |
158 | result = 1; |
159 | } |
160 | |
161 | /* Check whether srand48() restores the A and C parameters. */ |
162 | srand48 (seedval: 0x98765432); |
163 | |
164 | /* See whether the correct values are installed. */ |
165 | l = lrand48 (); |
166 | if (l != 0x2fed1413l) |
167 | { |
168 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
169 | __LINE__ - 4, 0x2fed1413l, l); |
170 | result = 1; |
171 | } |
172 | |
173 | l = mrand48 (); |
174 | if (l != -0x5d73effdl) |
175 | { |
176 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
177 | __LINE__ - 4, -0x5d73effdl, l); |
178 | result = 1; |
179 | } |
180 | |
181 | l = lrand48 (); |
182 | if (l != 0x585fcfb7l) |
183 | { |
184 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
185 | __LINE__ - 4, 0x585fcfb7l, l); |
186 | result = 1; |
187 | } |
188 | |
189 | l = mrand48 (); |
190 | if (l != -0x61770b8cl) |
191 | { |
192 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
193 | __LINE__ - 4, -0x61770b8cl, l); |
194 | result = 1; |
195 | } |
196 | |
197 | /* And again to see whether seed48() does the same. */ |
198 | lcong48 (param: lxs); |
199 | |
200 | /* See whether lxs wasn't modified. */ |
201 | l = lrand48 (); |
202 | if (l != 0x6df63d66l) |
203 | { |
204 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
205 | __LINE__ - 4, 0x6df63d66l, l); |
206 | result = 1; |
207 | } |
208 | |
209 | /* Test seed48. The previous call should have install the values in |
210 | the initialization of `xs' above. */ |
211 | xs[0] = 0x1234; |
212 | xs[1] = 0x5678; |
213 | xs[2] = 0x9012; |
214 | xsp = seed48 (seed16v: xs); |
215 | if (xsp[0] != 0x0637 || xsp[1] != 0x7acd || xsp[2] != 0xdbec) |
216 | { |
217 | puts (s: "seed48() did not install the values correctly" ); |
218 | printf (format: " expected: { %04hx, %04hx, %04hx }\n" , 0x0637, 0x7acd, 0xdbec); |
219 | printf (format: " seen: { %04hx, %04hx, %04hx }\n" , xsp[0], xsp[1], xsp[2]); |
220 | result = 1; |
221 | } |
222 | |
223 | /* Test lrand48 and mrand48. We continue from the seed established |
224 | above. */ |
225 | l = lrand48 (); |
226 | if (l != 0x017e48b5l) |
227 | { |
228 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
229 | __LINE__ - 4, 0x017e48b5l, l); |
230 | result = 1; |
231 | } |
232 | |
233 | l = mrand48 (); |
234 | if (l != -0x1485e05dl) |
235 | { |
236 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
237 | __LINE__ - 4, -0x1485e05dl, l); |
238 | result = 1; |
239 | } |
240 | |
241 | l = lrand48 (); |
242 | if (l != 0x6b6a3f95l) |
243 | { |
244 | printf (format: "lrand48() in line %d failed: expected %lx, seen %lx\n" , |
245 | __LINE__ - 4, 0x6b6a3f95l, l); |
246 | result = 1; |
247 | } |
248 | |
249 | l = mrand48 (); |
250 | if (l != 0x175c0d6fl) |
251 | { |
252 | printf (format: "mrand48() in line %d failed: expected %lx, seen %lx\n" , |
253 | __LINE__ - 4, 0x175c0d6fl, l); |
254 | result = 1; |
255 | } |
256 | |
257 | /* Test drand48. */ |
258 | d = drand48 (); |
259 | if (d != 0.0908832261858485424) |
260 | { |
261 | printf (format: "drand48() in line %d failed: expected %.*g, seen %.*g\n" , |
262 | __LINE__ - 4, DECIMAL_DIG, 0.0908832261858485424, |
263 | DECIMAL_DIG, d); |
264 | result = 1; |
265 | } |
266 | |
267 | d = drand48 (); |
268 | if (d != 0.943149381730059133133) |
269 | { |
270 | printf (format: "drand48() in line %d failed: expected %.*g, seen %.*g\n" , |
271 | __LINE__ - 4, DECIMAL_DIG, 0.943149381730059133133, |
272 | DECIMAL_DIG, d); |
273 | result = 1; |
274 | } |
275 | |
276 | /* Now the functions which get the Xis passed. */ |
277 | xs[0] = 0x3849; |
278 | xs[1] = 0x5061; |
279 | xs[2] = 0x7283; |
280 | |
281 | l = nrand48 (xsubi: xs); |
282 | if (l != 0x1efe61a1l) |
283 | { |
284 | printf (format: "nrand48() in line %d failed: expected %lx, seen %lx\n" , |
285 | __LINE__ - 4, 0x1efe61a1l, l); |
286 | result = 1; |
287 | } |
288 | |
289 | l = jrand48 (xsubi: xs); |
290 | if (l != -0xa973860l) |
291 | { |
292 | printf (format: "jrand48() in line %d failed: expected %lx, seen %lx\n" , |
293 | __LINE__ - 4, -0xa973860l, l); |
294 | result = 1; |
295 | } |
296 | |
297 | l = nrand48 (xsubi: xs); |
298 | if (l != 0x2a5e57fel) |
299 | { |
300 | printf (format: "nrand48() in line %d failed: expected %lx, seen %lx\n" , |
301 | __LINE__ - 4, 0x2a5e57fel, l); |
302 | result = 1; |
303 | } |
304 | |
305 | l = jrand48 (xsubi: xs); |
306 | if (l != 0x71a779a8l) |
307 | { |
308 | printf (format: "jrand48() in line %d failed: expected %lx, seen %lx\n" , |
309 | __LINE__ - 4, 0x71a779a8l, l); |
310 | result = 1; |
311 | } |
312 | |
313 | /* Test whether the global A and C are used. */ |
314 | lcong48 (param: lxs); |
315 | |
316 | l = nrand48 (xsubi: xs); |
317 | if (l != 0x32beee9fl) |
318 | { |
319 | printf (format: "nrand48() in line %d failed: expected %lx, seen %lx\n" , |
320 | __LINE__ - 4, 0x32beee9fl, l); |
321 | result = 1; |
322 | } |
323 | |
324 | l = jrand48 (xsubi: xs); |
325 | if (l != 0x7bddf3bal) |
326 | { |
327 | printf (format: "jrand48() in line %d failed: expected %lx, seen %lx\n" , |
328 | __LINE__ - 4, 0x7bddf3bal, l); |
329 | result = 1; |
330 | } |
331 | |
332 | l = nrand48 (xsubi: xs); |
333 | if (l != 0x85bdf28l) |
334 | { |
335 | printf (format: "nrand48() in line %d failed: expected %lx, seen %lx\n" , |
336 | __LINE__ - 4, 0x85bdf28l, l); |
337 | result = 1; |
338 | } |
339 | |
340 | l = jrand48 (xsubi: xs); |
341 | if (l != 0x7b433e47l) |
342 | { |
343 | printf (format: "jrand48() in line %d failed: expected %lx, seen %lx\n" , |
344 | __LINE__ - 4, 0x7b433e47l, l); |
345 | result = 1; |
346 | } |
347 | |
348 | /* Test erand48. Also compare with the drand48 results. */ |
349 | (void) seed48 (seed16v: xs); |
350 | |
351 | d = drand48 (); |
352 | e = erand48 (xsubi: xs); |
353 | if (d != e) |
354 | { |
355 | printf (format: "\ |
356 | drand48() and erand48 in lines %d and %d produce different results\n" , |
357 | __LINE__ - 6, __LINE__ - 5); |
358 | printf (format: " drand48() = %g, erand48() = %g\n" , d, e); |
359 | result = 1; |
360 | } |
361 | else if (e != 0.640650904452755298735) |
362 | { |
363 | printf (format: "erand48() in line %d failed: expected %.*g, seen %.*g\n" , |
364 | __LINE__ - 4, DECIMAL_DIG, 0.640650904452755298735, |
365 | DECIMAL_DIG, e); |
366 | result = 1; |
367 | |
368 | } |
369 | |
370 | d = drand48 (); |
371 | e = erand48 (xsubi: xs); |
372 | if (d != e) |
373 | { |
374 | printf (format: "\ |
375 | drand48() and erand48 in lines %d and %d produce different results\n" , |
376 | __LINE__ - 6, __LINE__ - 5); |
377 | printf (format: " drand48() = %g, erand48() = %g\n" , d, e); |
378 | result = 1; |
379 | } |
380 | else if (e != 0.115372323508150742555) |
381 | { |
382 | printf (format: "erand48() in line %d failed: expected %.*g, seen %.*g\n" , |
383 | __LINE__ - 4, DECIMAL_DIG, 0.0115372323508150742555, |
384 | DECIMAL_DIG, e); |
385 | result = 1; |
386 | |
387 | } |
388 | |
389 | return result; |
390 | } |
391 | |
392 | #define TEST_FUNCTION do_test () |
393 | #include "../test-skeleton.c" |
394 | |