Upgrade to the current NetBSD rand implementation.
Also add basic unit tests. Change-Id: I7fc7ef61d47c1e8fdf8b8eff67a635220c3afd56
This commit is contained in:
57
libc/upstream-netbsd/libc/stdlib/_rand48.c
Normal file
57
libc/upstream-netbsd/libc/stdlib/_rand48.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/* $NetBSD: _rand48.c,v 1.7 2005/06/12 05:21:27 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: _rand48.c,v 1.7 2005/06/12 05:21:27 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
unsigned short __rand48_seed[3] = {
|
||||
RAND48_SEED_0,
|
||||
RAND48_SEED_1,
|
||||
RAND48_SEED_2
|
||||
};
|
||||
unsigned short __rand48_mult[3] = {
|
||||
RAND48_MULT_0,
|
||||
RAND48_MULT_1,
|
||||
RAND48_MULT_2
|
||||
};
|
||||
unsigned short __rand48_add = RAND48_ADD;
|
||||
|
||||
void
|
||||
__dorand48(unsigned short xseed[3])
|
||||
{
|
||||
unsigned long accu;
|
||||
unsigned short temp[2];
|
||||
|
||||
_DIAGASSERT(xseed != NULL);
|
||||
|
||||
accu = (unsigned long) __rand48_mult[0] * (unsigned long) xseed[0] +
|
||||
(unsigned long) __rand48_add;
|
||||
temp[0] = (unsigned short) accu; /* lower 16 bits */
|
||||
accu >>= sizeof(unsigned short) * 8;
|
||||
accu += (unsigned long) __rand48_mult[0] * (unsigned long) xseed[1] +
|
||||
(unsigned long) __rand48_mult[1] * (unsigned long) xseed[0];
|
||||
temp[1] = (unsigned short) accu; /* middle 16 bits */
|
||||
accu >>= sizeof(unsigned short) * 8;
|
||||
accu += __rand48_mult[0] * xseed[2] + __rand48_mult[1] * xseed[1] + __rand48_mult[2] * xseed[0];
|
||||
xseed[0] = temp[0];
|
||||
xseed[1] = temp[1];
|
||||
xseed[2] = (unsigned short) accu;
|
||||
}
|
||||
32
libc/upstream-netbsd/libc/stdlib/drand48.c
Normal file
32
libc/upstream-netbsd/libc/stdlib/drand48.c
Normal file
@@ -0,0 +1,32 @@
|
||||
/* $NetBSD: drand48.c,v 1.6 2005/06/12 05:21:28 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: drand48.c,v 1.6 2005/06/12 05:21:28 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(drand48,_drand48)
|
||||
#endif
|
||||
|
||||
double
|
||||
drand48(void)
|
||||
{
|
||||
return erand48(__rand48_seed);
|
||||
}
|
||||
42
libc/upstream-netbsd/libc/stdlib/erand48.c
Normal file
42
libc/upstream-netbsd/libc/stdlib/erand48.c
Normal file
@@ -0,0 +1,42 @@
|
||||
/* $NetBSD: erand48.c,v 1.9 2006/03/22 20:52:16 drochner Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: erand48.c,v 1.9 2006/03/22 20:52:16 drochner Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(erand48,_erand48)
|
||||
#endif
|
||||
|
||||
double
|
||||
erand48(unsigned short xseed[3])
|
||||
{
|
||||
|
||||
_DIAGASSERT(xseed != NULL);
|
||||
|
||||
__dorand48(xseed);
|
||||
return ldexp((double) xseed[0], -48) +
|
||||
ldexp((double) xseed[1], -32) +
|
||||
ldexp((double) xseed[2], -16);
|
||||
}
|
||||
39
libc/upstream-netbsd/libc/stdlib/jrand48.c
Normal file
39
libc/upstream-netbsd/libc/stdlib/jrand48.c
Normal file
@@ -0,0 +1,39 @@
|
||||
/* $NetBSD: jrand48.c,v 1.8 2005/06/12 05:21:28 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: jrand48.c,v 1.8 2005/06/12 05:21:28 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(jrand48,_jrand48)
|
||||
#endif
|
||||
|
||||
long
|
||||
jrand48(unsigned short xseed[3])
|
||||
{
|
||||
|
||||
_DIAGASSERT(xseed != NULL);
|
||||
|
||||
__dorand48(xseed);
|
||||
return ((long) xseed[2] << 16) + (long) xseed[1];
|
||||
}
|
||||
34
libc/upstream-netbsd/libc/stdlib/lrand48.c
Normal file
34
libc/upstream-netbsd/libc/stdlib/lrand48.c
Normal file
@@ -0,0 +1,34 @@
|
||||
/* $NetBSD: lrand48.c,v 1.8 2005/06/12 05:21:28 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: lrand48.c,v 1.8 2005/06/12 05:21:28 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(lrand48,_lrand48)
|
||||
#endif
|
||||
|
||||
long
|
||||
lrand48(void)
|
||||
{
|
||||
__dorand48(__rand48_seed);
|
||||
return (long)((unsigned long) __rand48_seed[2] << 15) +
|
||||
((unsigned long) __rand48_seed[1] >> 1);
|
||||
}
|
||||
33
libc/upstream-netbsd/libc/stdlib/mrand48.c
Normal file
33
libc/upstream-netbsd/libc/stdlib/mrand48.c
Normal file
@@ -0,0 +1,33 @@
|
||||
/* $NetBSD: mrand48.c,v 1.7 2005/06/12 05:21:28 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: mrand48.c,v 1.7 2005/06/12 05:21:28 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(mrand48,_mrand48)
|
||||
#endif
|
||||
|
||||
long
|
||||
mrand48(void)
|
||||
{
|
||||
__dorand48(__rand48_seed);
|
||||
return ((long) __rand48_seed[2] << 16) + (long) __rand48_seed[1];
|
||||
}
|
||||
39
libc/upstream-netbsd/libc/stdlib/nrand48.c
Normal file
39
libc/upstream-netbsd/libc/stdlib/nrand48.c
Normal file
@@ -0,0 +1,39 @@
|
||||
/* $NetBSD: nrand48.c,v 1.9 2005/06/12 05:21:28 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: nrand48.c,v 1.9 2005/06/12 05:21:28 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(nrand48,_nrand48)
|
||||
#endif
|
||||
|
||||
long
|
||||
nrand48(unsigned short xseed[3])
|
||||
{
|
||||
_DIAGASSERT(xseed != NULL);
|
||||
|
||||
__dorand48(xseed);
|
||||
return (long)((unsigned long) xseed[2] << 15) +
|
||||
((unsigned long) xseed[1] >> 1);
|
||||
}
|
||||
38
libc/upstream-netbsd/libc/stdlib/srand48.c
Normal file
38
libc/upstream-netbsd/libc/stdlib/srand48.c
Normal file
@@ -0,0 +1,38 @@
|
||||
/* $NetBSD: srand48.c,v 1.7 2005/06/12 05:21:28 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: srand48.c,v 1.7 2005/06/12 05:21:28 lukem Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
#include "rand48.h"
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(srand48,_srand48)
|
||||
#endif
|
||||
|
||||
void
|
||||
srand48(long seed)
|
||||
{
|
||||
__rand48_seed[0] = RAND48_SEED_0;
|
||||
__rand48_seed[1] = (unsigned short) seed;
|
||||
__rand48_seed[2] = (unsigned short) ((unsigned long)seed >> 16);
|
||||
__rand48_mult[0] = RAND48_MULT_0;
|
||||
__rand48_mult[1] = RAND48_MULT_1;
|
||||
__rand48_mult[2] = RAND48_MULT_2;
|
||||
__rand48_add = RAND48_ADD;
|
||||
}
|
||||
Reference in New Issue
Block a user