1 #include <stdio.h> 2 #include <stdlib.h> 3 4 double drand48(void); 5 6 static int fails = 0; 7 8 static int 9 double_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 54 int 55 main(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