test_drand48.c revision aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8
1#include <stdio.h>
2#include <stdlib.h>
3
4double drand48(void);
5
6static int fails = 0;
7
8static int
9double_eq(double a, double b)
10{
11    /* Compare two double values, and return 1 if they are "close" enough */
12    double diff = a -b;
13    if (diff < 0) diff = -diff;
14    if (a < 0) {
15        if (b >= 0)
16            return 0;
17        a = -a;
18        b = -b;
19    } else if (b < 0) {
20        return 0;
21    }
22    if (a >= b)
23        a = b;
24
25    return diff < a*1e-8;
26}
27
28#define EXPECT_LONG(value,expected) \
29    do { \
30        long _val = (value); \
31        long _expected = (expected); \
32        printf( "%s: ", #value); \
33        if (_val != _expected) { \
34            printf("KO: %ld (%ld expected)\n", _val, _expected); \
35            fails += 1; \
36        } else { \
37            printf("%ld (ok)\n", _expected); \
38        } \
39    } while (0)
40
41#define EXPECT_DOUBLE(value,expected) \
42    do { \
43        double _val = (value); \
44        double _expected = (expected); \
45        printf( "%s: ", #value); \
46        if (!double_eq(_val,_expected)) { \
47            printf("KO: %.12g (%.12g expected)\n", _val, _expected); \
48            fails += 1; \
49        } else { \
50            printf("%.12g (ok)\n", _expected); \
51        } \
52    } while (0)
53
54int
55main(void)
56{
57    long int l = -345678L;
58    float  f = 123.456e14;
59    double d = -87.65432e45;
60
61    // Verify display of hard-coded float and double values.
62    // This is done to confirm the correct printf format specifiers
63    // are being used.
64    puts("Hard-coded values");
65    printf("  l: %li\n", l);
66    printf("  f: %g\n", (double) f);
67    printf("  d: %g\n", d);
68
69    // lrand48
70    puts("lrand48");
71    puts("  srand48(100)");
72    srand48(100);
73    EXPECT_LONG(lrand48(),539144888);
74    EXPECT_LONG(lrand48(),448713282);
75    EXPECT_LONG(lrand48(),2020627300);
76
77    // Try again, with same seed.  Should get the same values
78    puts("  srand48(100)");
79    srand48(100);
80    EXPECT_LONG(lrand48(),539144888);
81    EXPECT_LONG(lrand48(),448713282);
82    EXPECT_LONG(lrand48(),2020627300);
83
84    // Try again, but with a different seed
85    puts("  srand48(101)");
86    srand48(101);
87    EXPECT_LONG(lrand48(),261694958);
88    EXPECT_LONG(lrand48(),1961809783);
89    EXPECT_LONG(lrand48(),1458943423);
90
91    // drand48
92    puts("drand48");
93    puts("  srand48(100)");
94    srand48(100);
95    EXPECT_DOUBLE(drand48(),0.251058902665);
96    EXPECT_DOUBLE(drand48(),0.208948404851);
97    EXPECT_DOUBLE(drand48(),0.940927909958);
98
99    // Try again, with same seed.  Should get the same values
100    puts("  srand48(100)");
101    srand48(100);
102    EXPECT_DOUBLE(drand48(),0.251058902665);
103    EXPECT_DOUBLE(drand48(),0.208948404851);
104    EXPECT_DOUBLE(drand48(),0.940927909958);
105
106    // Try again, but with a different seed
107    puts("  srand48(101)");
108    srand48(101);
109    EXPECT_DOUBLE(drand48(),0.121861211331);
110    EXPECT_DOUBLE(drand48(),0.913538869095);
111    EXPECT_DOUBLE(drand48(),0.679373472502);
112
113    return (fails > 0) ? 1 : 0;
114}
115