root / synthbench / euroben-ports / base / C-MPI / mod2as / .svn / text-base / rand64.c.svn-base @ 0:839f52ef7657
History | View | Annotate | Download (922 Bytes)
1 |
#define NORM 5.4210108624275221e-20 |
---|---|
2 |
#define L1 18446744073709551614UL |
3 |
#define L2 18446744073709551104UL |
4 |
#define L3 18446744073709547520UL |
5 |
#define L4 18446744073709420544UL |
6 |
#define L5 18446744073701163008UL |
7 |
|
8 |
long z1, z2, z3, z4, z5; |
9 |
|
10 |
void setrand( int seed ) |
11 |
{ |
12 |
long lseed; |
13 |
|
14 |
// --- Initialise rand64. |
15 |
|
16 |
lseed = (long) seed; |
17 |
z1 = lseed; z2 = z1 + 4087; z3 = z2 + 319; z4 = z3 + 1881; z5 = z4 + 13257; |
18 |
} |
19 |
|
20 |
double rand64( void ) |
21 |
{ |
22 |
unsigned long b; |
23 |
|
24 |
b = ((( z1 << 1 ) ^ z1 ) >> 53 ); |
25 |
z1 = ((( z1 & L1 ) << 10 ) ^ b ); |
26 |
b = ((( z2 << 24 ) ^ z2 ) >> 50 ); |
27 |
z2 = ((( z2 & L2 ) << 5 ) ^ b ); |
28 |
b = ((( z3 << 3 ) ^ z3 ) >> 23 ); |
29 |
z3 = ((( z3 & L3 ) << 29 ) ^ b ); |
30 |
b = ((( z4 << 5 ) ^ z4 ) >> 24 ); |
31 |
z4 = ((( z4 & L4 ) << 23 ) ^ b ); |
32 |
b = ((( z5 << 3 ) ^ z5 ) >> 33 ); |
33 |
z5 = ((( z5 & L5 ) << 8 ) ^ b ); |
34 |
|
35 |
return( ( z1 ^ z2 ^ z3 ^ z4 ^ z5 )*NORM + 0.5 ); |
36 |
} |