| #include <stdio.h> |
| #include <stdlib.h> |
| |
| double drand48(void); |
| |
| static int fails = 0; |
| |
| static int |
| double_eq(double a, double b) |
| { |
| /* Compare two double values, and return 1 if they are "close" enough */ |
| double diff = a -b; |
| if (diff < 0) diff = -diff; |
| if (a < 0) { |
| if (b >= 0) |
| return 0; |
| a = -a; |
| b = -b; |
| } else if (b < 0) { |
| return 0; |
| } |
| if (a >= b) |
| a = b; |
| |
| return diff < a*1e-8; |
| } |
| |
| #define EXPECT_LONG(value,expected) \ |
| do { \ |
| long _val = (value); \ |
| long _expected = (expected); \ |
| printf( "%s: ", #value); \ |
| if (_val != _expected) { \ |
| printf("KO: %ld (%ld expected)\n", _val, _expected); \ |
| fails += 1; \ |
| } else { \ |
| printf("%ld (ok)\n", _expected); \ |
| } \ |
| } while (0) |
| |
| #define EXPECT_DOUBLE(value,expected) \ |
| do { \ |
| double _val = (value); \ |
| double _expected = (expected); \ |
| printf( "%s: ", #value); \ |
| if (!double_eq(_val,_expected)) { \ |
| printf("KO: %.12g (%.12g expected)\n", _val, _expected); \ |
| fails += 1; \ |
| } else { \ |
| printf("%.12g (ok)\n", _expected); \ |
| } \ |
| } while (0) |
| |
| int |
| main(void) |
| { |
| long int l = -345678L; |
| float f = 123.456e14; |
| double d = -87.65432e45; |
| |
| // Verify display of hard-coded float and double values. |
| // This is done to confirm the correct printf format specifiers |
| // are being used. |
| puts("Hard-coded values"); |
| printf(" l: %li\n", l); |
| printf(" f: %g\n", (double) f); |
| printf(" d: %g\n", d); |
| |
| // lrand48 |
| puts("lrand48"); |
| puts(" srand48(100)"); |
| srand48(100); |
| EXPECT_LONG(lrand48(),539144888); |
| EXPECT_LONG(lrand48(),448713282); |
| EXPECT_LONG(lrand48(),2020627300); |
| |
| // Try again, with same seed. Should get the same values |
| puts(" srand48(100)"); |
| srand48(100); |
| EXPECT_LONG(lrand48(),539144888); |
| EXPECT_LONG(lrand48(),448713282); |
| EXPECT_LONG(lrand48(),2020627300); |
| |
| // Try again, but with a different seed |
| puts(" srand48(101)"); |
| srand48(101); |
| EXPECT_LONG(lrand48(),261694958); |
| EXPECT_LONG(lrand48(),1961809783); |
| EXPECT_LONG(lrand48(),1458943423); |
| |
| // drand48 |
| puts("drand48"); |
| puts(" srand48(100)"); |
| srand48(100); |
| EXPECT_DOUBLE(drand48(),0.251058902665); |
| EXPECT_DOUBLE(drand48(),0.208948404851); |
| EXPECT_DOUBLE(drand48(),0.940927909958); |
| |
| // Try again, with same seed. Should get the same values |
| puts(" srand48(100)"); |
| srand48(100); |
| EXPECT_DOUBLE(drand48(),0.251058902665); |
| EXPECT_DOUBLE(drand48(),0.208948404851); |
| EXPECT_DOUBLE(drand48(),0.940927909958); |
| |
| // Try again, but with a different seed |
| puts(" srand48(101)"); |
| srand48(101); |
| EXPECT_DOUBLE(drand48(),0.121861211331); |
| EXPECT_DOUBLE(drand48(),0.913538869095); |
| EXPECT_DOUBLE(drand48(),0.679373472502); |
| |
| return (fails > 0) ? 1 : 0; |
| } |