mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 08:04:57 +00:00
LibC: Add drand48
, srand48
These functions are required for the `perl5` port's random function to operate correctly. As a bonus, this allows us to remove a nasty patch that replaces `drand48` with `random`.
This commit is contained in:
parent
12e534c8c6
commit
8bc1f1b63e
2 changed files with 20 additions and 0 deletions
|
@ -657,6 +657,7 @@ int ptsname_r(int fd, char* buffer, size_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long s_next_rand = 1;
|
static unsigned long s_next_rand = 1;
|
||||||
|
static long s_next_rand48 = 0;
|
||||||
|
|
||||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/rand.html
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/rand.html
|
||||||
int rand()
|
int rand()
|
||||||
|
@ -671,6 +672,23 @@ void srand(unsigned seed)
|
||||||
s_next_rand = seed;
|
s_next_rand = seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/drand48.html
|
||||||
|
double drand48()
|
||||||
|
{
|
||||||
|
constexpr u64 a = 0x5DEECE66DULL;
|
||||||
|
constexpr u64 c = 0xBULL;
|
||||||
|
constexpr u64 m = 1ULL << 48;
|
||||||
|
|
||||||
|
s_next_rand48 = (a * s_next_rand48 + c) & (m - 1);
|
||||||
|
return static_cast<double>(s_next_rand48) / m;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/srand48.html
|
||||||
|
void srand48(long seed)
|
||||||
|
{
|
||||||
|
s_next_rand48 = (seed & 0xFFFFFFFF) << 16 | 0x330E;
|
||||||
|
}
|
||||||
|
|
||||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/abs.html
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/abs.html
|
||||||
int abs(int i)
|
int abs(int i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,6 +78,8 @@ __attribute__((noreturn)) void _Exit(int status);
|
||||||
#define RAND_MAX 32767
|
#define RAND_MAX 32767
|
||||||
int rand(void);
|
int rand(void);
|
||||||
void srand(unsigned seed);
|
void srand(unsigned seed);
|
||||||
|
double drand48(void);
|
||||||
|
void srand48(long seed);
|
||||||
|
|
||||||
long int random(void);
|
long int random(void);
|
||||||
void srandom(unsigned seed);
|
void srandom(unsigned seed);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue