| #include <float.h> | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 |  | 
 | #ifndef DECIMAL_DIG | 
 | # define DECIMAL_DIG	21 | 
 | #endif | 
 |  | 
 |  | 
 | static int | 
 | do_test (void) | 
 | { | 
 |   unsigned short int xs[3] = { 0x0001, 0x0012, 0x0123 }; | 
 |   unsigned short int lxs[7]; | 
 |   unsigned short int *xsp; | 
 |   int result = 0; | 
 |   long int l; | 
 |   double d; | 
 |   double e; | 
 |  | 
 |   /* Test srand48.  */ | 
 |   srand48 (0x98765432); | 
 |   /* Get the values of the internal Xi array.  */ | 
 |   xsp = seed48 (xs); | 
 |   if (xsp[0] != 0x330e || xsp[1] != 0x5432 || xsp[2] != 0x9876) | 
 |     { | 
 |       puts ("srand48(0x98765432) didn't set correct value"); | 
 |       printf ("  expected: { %04hx, %04hx, %04hx }\n", 0x330e, 0x5432, 0x9876); | 
 |       printf ("  seen:     { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]); | 
 |       result = 1; | 
 |     } | 
 |   /* Put the values back.  */ | 
 |   memcpy (xs, xsp, sizeof (xs)); | 
 |   (void) seed48 (xs); | 
 |  | 
 |   /* See whether the correct values are installed.  */ | 
 |   l = lrand48 (); | 
 |   if (l != 0x2fed1413l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x2fed1413l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != -0x5d73effdl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0x5d73effdl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = lrand48 (); | 
 |   if (l != 0x585fcfb7l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x585fcfb7l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != -0x61770b8cl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0x61770b8cl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test seed48.  The previous call should have install the values in | 
 |      the initialization of `xs' above.  */ | 
 |   xs[0] = 0x1234; | 
 |   xs[1] = 0x5678; | 
 |   xs[2] = 0x9012; | 
 |   xsp = seed48 (xs); | 
 |   if (xsp[0] != 0x62f2 || xsp[1] != 0xf474 || xsp[2] != 0x9e88) | 
 |     { | 
 |       puts ("seed48() did not install the values correctly"); | 
 |       printf ("  expected: { %04hx, %04hx, %04hx }\n", 0x62f2, 0xf474, 0x9e88); | 
 |       printf ("  seen:     { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test lrand48 and mrand48.  We continue from the seed established | 
 |      above.  */ | 
 |   l = lrand48 (); | 
 |   if (l != 0x017e48b5l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x017e48b5l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != -0x1485e05dl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0x1485e05dl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = lrand48 (); | 
 |   if (l != 0x6b6a3f95l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x6b6a3f95l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != 0x175c0d6fl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x175c0d6fl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test lcong48.  */ | 
 |   lxs[0] = 0x4567; | 
 |   lxs[1] = 0x6789; | 
 |   lxs[2] = 0x8901; | 
 |   lxs[3] = 0x0123; | 
 |   lxs[4] = 0x2345; | 
 |   lxs[5] = 0x1111; | 
 |   lxs[6] = 0x2222; | 
 |   lcong48 (lxs); | 
 |  | 
 |   /* See whether the correct values are installed.  */ | 
 |   l = lrand48 (); | 
 |   if (l != 0x6df63d66l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x6df63d66l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != 0x2f92c8e1l) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x2f92c8e1l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = lrand48 (); | 
 |   if (l != 0x3b4869ffl) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x3b4869ffl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != 0x5cd4cc3el) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x5cd4cc3el, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Check whether srand48() restores the A and C parameters.  */ | 
 |   srand48 (0x98765432); | 
 |  | 
 |   /* See whether the correct values are installed.  */ | 
 |   l = lrand48 (); | 
 |   if (l != 0x2fed1413l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x2fed1413l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != -0x5d73effdl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0x5d73effdl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = lrand48 (); | 
 |   if (l != 0x585fcfb7l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x585fcfb7l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != -0x61770b8cl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0x61770b8cl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* And again to see whether seed48() does the same.  */ | 
 |   lcong48 (lxs); | 
 |  | 
 |   /* See whether lxs wasn't modified.  */ | 
 |   l = lrand48 (); | 
 |   if (l != 0x6df63d66l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x6df63d66l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test seed48.  The previous call should have install the values in | 
 |      the initialization of `xs' above.  */ | 
 |   xs[0] = 0x1234; | 
 |   xs[1] = 0x5678; | 
 |   xs[2] = 0x9012; | 
 |   xsp = seed48 (xs); | 
 |   if (xsp[0] != 0x0637 || xsp[1] != 0x7acd || xsp[2] != 0xdbec) | 
 |     { | 
 |       puts ("seed48() did not install the values correctly"); | 
 |       printf ("  expected: { %04hx, %04hx, %04hx }\n", 0x0637, 0x7acd, 0xdbec); | 
 |       printf ("  seen:     { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test lrand48 and mrand48.  We continue from the seed established | 
 |      above.  */ | 
 |   l = lrand48 (); | 
 |   if (l != 0x017e48b5l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x017e48b5l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != -0x1485e05dl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0x1485e05dl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = lrand48 (); | 
 |   if (l != 0x6b6a3f95l) | 
 |     { | 
 |       printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x6b6a3f95l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = mrand48 (); | 
 |   if (l != 0x175c0d6fl) | 
 |     { | 
 |       printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x175c0d6fl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test drand48.  */ | 
 |   d = drand48 (); | 
 |   if (d != 0.0908832261858485424) | 
 |     { | 
 |       printf ("drand48() in line %d failed: expected %.*g, seen %.*g\n", | 
 | 	      __LINE__ - 4, DECIMAL_DIG, 0.0908832261858485424, | 
 | 	      DECIMAL_DIG, d); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   d = drand48 (); | 
 |   if (d != 0.943149381730059133133) | 
 |     { | 
 |       printf ("drand48() in line %d failed: expected %.*g, seen %.*g\n", | 
 | 	      __LINE__ - 4, DECIMAL_DIG, 0.943149381730059133133, | 
 | 	      DECIMAL_DIG, d); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Now the functions which get the Xis passed.  */ | 
 |   xs[0] = 0x3849; | 
 |   xs[1] = 0x5061; | 
 |   xs[2] = 0x7283; | 
 |  | 
 |   l = nrand48 (xs); | 
 |   if (l != 0x1efe61a1l) | 
 |     { | 
 |       printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x1efe61a1l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = jrand48 (xs); | 
 |   if (l != -0xa973860l) | 
 |     { | 
 |       printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, -0xa973860l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = nrand48 (xs); | 
 |   if (l != 0x2a5e57fel) | 
 |     { | 
 |       printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x2a5e57fel, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = jrand48 (xs); | 
 |   if (l != 0x71a779a8l) | 
 |     { | 
 |       printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x71a779a8l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test whether the global A and C are used.  */ | 
 |   lcong48 (lxs); | 
 |  | 
 |   l = nrand48 (xs); | 
 |   if (l != 0x32beee9fl) | 
 |     { | 
 |       printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x32beee9fl, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = jrand48 (xs); | 
 |   if (l != 0x7bddf3bal) | 
 |     { | 
 |       printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x7bddf3bal, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = nrand48 (xs); | 
 |   if (l != 0x85bdf28l) | 
 |     { | 
 |       printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x85bdf28l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   l = jrand48 (xs); | 
 |   if (l != 0x7b433e47l) | 
 |     { | 
 |       printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", | 
 | 	      __LINE__ - 4, 0x7b433e47l, l); | 
 |       result = 1; | 
 |     } | 
 |  | 
 |   /* Test erand48.  Also compare with the drand48 results.  */ | 
 |   (void) seed48 (xs); | 
 |  | 
 |   d = drand48 (); | 
 |   e = erand48 (xs); | 
 |   if (d != e) | 
 |     { | 
 |       printf ("\ | 
 | drand48() and erand48 in lines %d and %d produce different results\n", | 
 | 	      __LINE__ - 6, __LINE__ - 5); | 
 |       printf ("  drand48() = %g, erand48() = %g\n", d, e); | 
 |       result = 1; | 
 |     } | 
 |   else if (e != 0.640650904452755298735) | 
 |     { | 
 |       printf ("erand48() in line %d failed: expected %.*g, seen %.*g\n", | 
 | 	      __LINE__ - 4, DECIMAL_DIG, 0.640650904452755298735, | 
 | 	      DECIMAL_DIG, e); | 
 |       result = 1; | 
 |  | 
 |     } | 
 |  | 
 |   d = drand48 (); | 
 |   e = erand48 (xs); | 
 |   if (d != e) | 
 |     { | 
 |       printf ("\ | 
 | drand48() and erand48 in lines %d and %d produce different results\n", | 
 | 	      __LINE__ - 6, __LINE__ - 5); | 
 |       printf ("  drand48() = %g, erand48() = %g\n", d, e); | 
 |       result = 1; | 
 |     } | 
 |   else if (e != 0.115372323508150742555) | 
 |     { | 
 |       printf ("erand48() in line %d failed: expected %.*g, seen %.*g\n", | 
 | 	      __LINE__ - 4, DECIMAL_DIG, 0.0115372323508150742555, | 
 | 	      DECIMAL_DIG, e); | 
 |       result = 1; | 
 |  | 
 |     } | 
 |  | 
 |   return result; | 
 | } | 
 |  | 
 | #define TEST_FUNCTION do_test () | 
 | #include "../test-skeleton.c" |