#include #include #include #include #include struct { int i[15]; volatile double d; } dd __attribute__((aligned(4096)));; #define d dd.d // volatile double d __attribute__((aligned(8))); unsigned short i; void* update(void *unused) { while(1) { d = i + i * (1. / 4294967296.); i = (i + 1); } return 0; } void* check(void* unused) { while(1) { double tmp = d; int j = tmp; double k = j + j * (1. / 4294967296.); if(k != tmp) { printf("%24a %24a %24a\n", k, tmp, k - tmp); exit(1); } } return 0; } int main(void) { pthread_t t1, t2; d = 0; i = 0; pthread_create(&t1, 0, update, 0); pthread_create(&t2, 0, check, 0); pthread_exit(0); }