Prefer https to http for gnu.org and fsf.org URLs
[platform/upstream/glibc.git] / stdlib / tst-rand48.c
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 (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: { %04hx, %04hx, %04hx }\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: { %04hx, %04hx, %04hx }\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: { %04hx, %04hx, %04hx }\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"