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にされてる模様。
- g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
- Windows XP, Core Duo 1.83GHz
ちなみに、
だと正しく出た。