Octopus
quickrnd.c
Go to the documentation of this file.
1#include <stdint.h>
2#include <assert.h>
3
4// 2^64 / phi: Maximally irrational, with no obvious pattern of zeros and ones
5static const uint64_t GOLDEN_RATIO = 0x9e3779b97f4a7c15ULL;
6
7// 2^-52
8static const double two_powm52 = 0x1.0p-52;
9
10// 2^-53
11static const double two_powm53 = 0x1.0p-53;
12
26double u64_to_open01(const uint64_t x) {
27 return (double)(x >> 12) * two_powm52 + two_powm53;
28}
29
42double i64_to_open01(const int64_t x) {
43 // Modulo 2^64
44 const uint64_t ux = (uint64_t)x;
45 return u64_to_open01(ux);
46}
47
64 uint64_t z = x + 0x9e3779b97f4a7c15ULL;
65 z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9ULL;
66 z = (z ^ (z >> 27)) * 0x94d049bb133111ebULL;
67 return z ^ (z >> 31);
69
87 // force top bit to 0 (positive number)
88 return splitmix64_mixer(x) & 0x7FFFFFFFFFFFFFFFULL;
89}
90
99uint64_t hash_combine_ids(const uint64_t *ids, const uint32_t n) {
100 assert(n > 0);
101 uint64_t s = ids[0];
102 for(uint32_t i=1; i<n; i++) {
103 s = s ^ (ids[i] + GOLDEN_RATIO + (s << 6) + (s >> 2));
105 // force top bit to 0 (positive number)
106 return s & 0x7FFFFFFFFFFFFFFFULL;
__uint32_t uint32_t
Definition: io_binary.c:1336
__uint64_t uint64_t
Definition: io_binary.c:1337
__int64_t int64_t
Definition: io_binary.c:1328
real(real64) function s()
ptrdiff_t i
Definition: operate_inc.c:12
double i64_to_open01(const int64_t x)
Definition: quickrnd.c:280
static const uint64_t GOLDEN_RATIO
Definition: quickrnd.c:268
static const double two_powm52
Definition: quickrnd.c:271
__uint64_t uint64_t
Definition: quickrnd.c:198
uint64_t splitmix64_mixer(const uint64_t x)
Definition: quickrnd.c:286
uint64_t hash_combine_ids(const uint64_t *ids, const uint32_t n)
Definition: quickrnd.c:298
static const double two_powm53
Definition: quickrnd.c:274
uint64_t splitmix64_mixer_2pow63(const uint64_t x)
Definition: quickrnd.c:293
double u64_to_open01(const uint64_t x)
Definition: quickrnd.c:276