aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-01-20 04:33:16 +0000
committerUlrich Drepper <drepper@redhat.com>2001-01-20 04:33:16 +0000
commitdf152cc80e60dc8bf7167a62ee26cb19a9a675d3 (patch)
treea21dc460c0bc8d84bc1b83282dbcdb57392e575f /stdlib
parentec4ae3b891da3b7c0a0938c0b100178207ad2cc3 (diff)
downloadglibc-df152cc80e60dc8bf7167a62ee26cb19a9a675d3.tar
glibc-df152cc80e60dc8bf7167a62ee26cb19a9a675d3.tar.gz
glibc-df152cc80e60dc8bf7167a62ee26cb19a9a675d3.tar.bz2
glibc-df152cc80e60dc8bf7167a62ee26cb19a9a675d3.zip
Update.
* stdlib/jrand48_r.c (__jrand48_r): Correct constructing of results. Reported by Jeff Higham <jhigham@algorithmics.com>. * stdlib/tst-rand48.c: New file. * stdlib/Makefile (tests): Add tst-rand48.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/Makefile5
-rw-r--r--stdlib/jrand48_r.c9
-rw-r--r--stdlib/tst-rand48.c390
3 files changed, 396 insertions, 8 deletions
diff --git a/stdlib/Makefile b/stdlib/Makefile
index a20a30768f..f93dc221b0 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-1999, 2000 Free Software Foundation, Inc.
+# Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -53,7 +53,8 @@ distribute := exit.h grouping.h abort-instr.h isomac.c tst-fmtmsg.sh
test-srcs := tst-fmtmsg
tests := tst-strtol tst-strtod testmb testrand testsort testdiv \
test-canon test-canon2 tst-strtoll tst-environ \
- tst-xpg-basename tst-random tst-bsearch tst-limits
+ tst-xpg-basename tst-random tst-bsearch tst-limits \
+ tst-rand48
# Several mpn functions from GNU MP are used by the strtod function.
diff --git a/stdlib/jrand48_r.c b/stdlib/jrand48_r.c
index 95f3ec62b2..48def5ef35 100644
--- a/stdlib/jrand48_r.c
+++ b/stdlib/jrand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -31,12 +31,9 @@ __jrand48_r (xsubi, buffer, result)
/* Store the result. */
if (sizeof (unsigned short int) == 2)
- *result = ((xsubi[2] & 0x7fff) << 16) | xsubi[1];
+ *result = (xsubi[2] << 16) | xsubi[1];
else
- *result = xsubi[2] & 0x7fffffffl;
-
- if (xsubi[2] & (1 << (sizeof (xsubi[2]) * 8 - 1)))
- *result *= -1;
+ *result = xsubi[2] & 0xffffffffl;
return 0;
}
diff --git a/stdlib/tst-rand48.c b/stdlib/tst-rand48.c
new file mode 100644
index 0000000000..fd2c4c1955
--- /dev/null
+++ b/stdlib/tst-rand48.c
@@ -0,0 +1,390 @@
+#include <float.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef DECIMAL_DIG
+# define DECIMAL_DIG 21
+#endif
+
+
+int
+main (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 != 0xa28c1003l)
+ {
+ printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0xa28c1003l, 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 != 0x9e88f474l)
+ {
+ printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0x9e88f474l, 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 != 0xeb7a1fa3l)
+ {
+ printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0xeb7a1fa3l, 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 != 0xa28c1003l)
+ {
+ printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0xa28c1003l, 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 != 0x9e88f474l)
+ {
+ printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0x9e88f474l, 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 != 0xeb7a1fa3l)
+ {
+ printf ("mrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0xeb7a1fa3l, 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 != 0xf568c7a0l)
+ {
+ printf ("jrand48() in line %d failed: expected %lx, seen %lx\n",
+ __LINE__ - 4, 0xf568c7a0l, 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;
+}