#include <pthread.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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);
}
