Statistics
| Branch: | Revision:

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
}