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
do_test(void)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 (0x98765432);
24 /* Get the values of the internal Xi array. */
25 xsp = seed48 (xs);
26 if (xsp[0] != 0x330e || xsp[1] != 0x5432 || xsp[2] != 0x9876)
27 {
28 puts ("srand48(0x98765432) didn't set correct value");
29 printf (" expected: { %04x, %04x, %04x }\n", 0x330e, 0x5432, 0x9876);
30 printf (" 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 (xs);
36
37 /* See whether the correct values are installed. */
38 l = lrand48 ();
39 if (l != 0x2fed1413l)
40 {
41 printf ("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 ("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 ("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 ("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 (xs);
76 if (xsp[0] != 0x62f2 || xsp[1] != 0xf474 || xsp[2] != 0x9e88)
77 {
78 puts ("seed48() did not install the values correctly");
79 printf (" expected: { %04x, %04x, %04x }\n", 0x62f2, 0xf474, 0x9e88);
80 printf (" 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 ("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 ("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 ("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 ("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 (lxs);
127
128 /* See whether the correct values are installed. */
129 l = lrand48 ();
130 if (l != 0x6df63d66l)
131 {
132 printf ("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 ("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 ("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 ("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 (0x98765432);
163
164 /* See whether the correct values are installed. */
165 l = lrand48 ();
166 if (l != 0x2fed1413l)
167 {
168 printf ("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 ("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 ("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 ("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 (lxs);
199
200 /* See whether lxs wasn't modified. */
201 l = lrand48 ();
202 if (l != 0x6df63d66l)
203 {
204 printf ("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 (xs);
215 if (xsp[0] != 0x0637 || xsp[1] != 0x7acd || xsp[2] != 0xdbec)
216 {
217 puts ("seed48() did not install the values correctly");
218 printf (" expected: { %04x, %04x, %04x }\n", 0x0637, 0x7acd, 0xdbec);
219 printf (" 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 ("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 ("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 ("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 ("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 ("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 ("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 (xs);
282 if (l != 0x1efe61a1l)
283 {
284 printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
285 __LINE__ - 4, 0x1efe61a1l, l);
286 result = 1;
287 }
288
289 l = jrand48 (xs);
290 if (l != -0xa973860l)
291 {
292 printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
293 __LINE__ - 4, -0xa973860l, l);
294 result = 1;
295 }
296
297 l = nrand48 (xs);
298 if (l != 0x2a5e57fel)
299 {
300 printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
301 __LINE__ - 4, 0x2a5e57fel, l);
302 result = 1;
303 }
304
305 l = jrand48 (xs);
306 if (l != 0x71a779a8l)
307 {
308 printf ("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 (lxs);
315
316 l = nrand48 (xs);
317 if (l != 0x32beee9fl)
318 {
319 printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
320 __LINE__ - 4, 0x32beee9fl, l);
321 result = 1;
322 }
323
324 l = jrand48 (xs);
325 if (l != 0x7bddf3bal)
326 {
327 printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
328 __LINE__ - 4, 0x7bddf3bal, l);
329 result = 1;
330 }
331
332 l = nrand48 (xs);
333 if (l != 0x85bdf28l)
334 {
335 printf ("nrand48() in line %d failed: expected %lx, seen %lx\n",
336 __LINE__ - 4, 0x85bdf28l, l);
337 result = 1;
338 }
339
340 l = jrand48 (xs);
341 if (l != 0x7b433e47l)
342 {
343 printf ("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 (xs);
350
351 d = drand48 ();
352 e = erand48 (xs);
353 if (d != e)
354 {
355 printf ("\
356 drand48() and erand48 in lines %d and %d produce different results\n",
357 __LINE__ - 6, __LINE__ - 5);
358 printf (" drand48() = %g, erand48() = %g\n", d, e);
359 result = 1;
360 }
361 else if (e != 0.640650904452755298735)
362 {
363 printf ("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 (xs);
372 if (d != e)
373 {
374 printf ("\
375 drand48() and erand48 in lines %d and %d produce different results\n",
376 __LINE__ - 6, __LINE__ - 5);
377 printf (" drand48() = %g, erand48() = %g\n", d, e);
378 result = 1;
379 }
380 else if (e != 0.115372323508150742555)
381 {
382 printf ("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