08/02/23 09:23:36
浮動小数点演算を行なうルーチンをコンソールアプリ(main関数)から呼んだときと
Win32 API で書いた GUI アプリから呼んだときとで計算結果が違うという問題に
悩まされています。どなたか解決策をご存じないでしょうか。
問題を再現する、できるだけ小さなプログラムを作りました。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
付属の Makefile は MinGW (GNU make)用です。
test1.exe(コンソールアプリ)と test2.exe(GUI アプリ)をビルドして実行します。
どちらも init.c の initialize() を呼び出します。
initialize() は double 型の配列 x を初期化する関数です。
計算結果を見るために x[5] と x[6] をカレントディレクトリの output.txt に書き出しています。
gcc version 3.4.5 (mingw special) では以下のようになりました。
test1.exe
x[5] = 4.7474747474747475e-001
x[6] = 4.6969696969696967e-001
test2.exe
x[5] = 4.7474747474747475e-001
x[6] = 4.6969696969696972e-001
同じルーチンを呼んでいるのに x[6] の値が異なります。x[5] は一致しています。
比較のために VC++ Toolkit 2003 (nmake.exe) 用の Makefile.vc も入れておきました。
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
でコンパイルしたところ2つのプログラムの計算結果が配列 x の全要素について一致しました。
MinGW (gcc) でコンパイルしたときの test2.exe の計算結果と一致しています。
すなわち test1.exe の計算結果がおかしいようです。
どなたか解決策をご存知の方がいらっしゃいましたらご教示下さい。よろしくお願いいたします。