Hi, I modified Aexander's test case a bit, and found something unexpected, which looks like a GCC-BUG to me:
cat test.c #include <string.h> #include <stdio.h> #include <stdlib.h> int main() { long double d0, d; memcpy(&d0, "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x3f\x00\x00\x00\x00\x00\x00", sizeof d0); // d = d0; memcpy(&d, &d0, sizeof d0); // if (memcmp(&d, &d0, sizeof d)) // abort(); printf("d = %Lf\n", d); for (unsigned char *p = (unsigned char *)&d + sizeof d; p > (unsigned char *)&d;) printf("%02x ", *--p); printf("\n"); } // EOF gcc -O3 test.c && ./a.out d = 0.000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 but, when I un-comment the memcmp the test case shows the expected result: d = 0.000000 00 00 00 00 00 00 3f ff 00 00 00 00 00 00 00 00 gcc-Version 7.0.0 20160613 (experimental) (GCC) Would'nt you agree, that if we use memcpy it should be possible to preserve denormalized or otherwise invalid bit patterns? And why should the memcmp have an influence on the memcpy? Bernd.