doubleを一度メモリに入れると値がずれる

よくある話です。
浮動小数点演算ではまった話 - bkブログにあるのと本質的には同じ。
要約すると

#include<stdio.h>
double a[100];
int main(int argc, char *argv[])
{
	volatile union{ long long a; double d; } A, B;
	A.a = 0xfff0000000000001LL;
	B.d = A.d; // ココ
	printf( "%llx\n", B.a );
	return 1;
}

結果は

fff8000000000001

ビットパターンコピーしているだけのつもりだったのだが、浮動小数点load/storeでsignaling NaNがquiet NaNにされてる模様。

ちなみに、

だと正しく出た。