我正在爲我的應用程序開發單元測試,但我遇到了一個我不明白的奇怪問題。C++雙重比較的奇怪行爲
的代碼是:
double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp);
我從Linux計算機(主機64位)爲Linux 64位編譯與海灣合作委員會(主機64位)和交叉編譯的Windows 32位的Linux的mingw32的編譯器。
該程序工作正常(斷言成功)在調試和發佈模式下的Linux編譯。 對於Windows版本,它在調試版本中工作正常,但不適用於發行版;斷言失敗。
奇怪的部份是,如果我插入跟蹤,測試工作在Windows中:
double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
printf("test");
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp); // Is TRUE when printf("test") is present, FALSE otherwise
我迷路了,我真不明白髮生了什麼。爲什麼printf
使它工作?
感謝您的幫助。
你能發佈相關的asm代碼嗎? – Paranaix
由於您使用的不是純C++的東西,因此很難理解您的代碼在做什麼。如何定義「BytesTool」和「QVERIFY」? –
@Paranaix我同意你的想法,-O3正在優化一些步驟,但printf()恢復了行爲。 – JayInNyc