Illustration of the effect of register allocation on floating-point numbers rounding depending on internal precision as described in "The pitfalls of verifying floating-point computations" by David Monniaux, section 3.1.1.

$ cat dummy.c 
void do_nothing(double *x __attribute ((unused))) {}
$ cat x87.c 
#include <assert.h>

void do_nothing(double *x);

int main(void)
        double x = 0x1p-1022, y = 0x1p100, z;
        z = x/y;
        if (z != 0) {
                assert(z != 0);
        return 0;
$ cc -std=c99 -Wall -W -pedantic -mfpmath=387 -O1 -o x87 dummy.c x87.c
$ ./x87 
x87: x87.c:12: main: Assertion `z != 0' failed.
$ cc -std=c99 -Wall -W -pedantic -mfpmath=sse -O1 -o x87 dummy.c x87.c
Example of how this behaviour affects real applications can be observed in PHP bug 53632.