2011-08-31 34 views
2

我編譯下面的代碼與-ffast-math選項:MINGW32的std :: isnan與-ffast,數學

#include <limits> 
#include <cmath> 
#include <iostream> 

int main() { 
    std::cout << std::isnan(std::numeric_limits<double>::quiet_NaN()) << std::endl; 
} 

我得到0作爲輸出。我的代碼如何通過-ffast-math編譯來判斷浮點數是否爲NaN?

注意:在linux上,std :: isnan即使使用-ffast-math也能工作。

回答

10

由於-ffast-math指示GCC不處理NaN s,因此預計isnan()具有未定義的行爲。因此返回0是有效的。

您可以使用isnan()下快速更換:

#if defined __FAST_MATH__ 
# undef isnan 
#endif 
#if !defined isnan 
# define isnan isnan 
# include <stdint.h> 
static inline int isnan(float f) 
{ 
    union { float f; uint32_t x; } u = { f }; 
    return (u.x << 1) > 0xff000000u; 
} 
#endif 
1

在Linux上,GCC標誌-ffast-math打破isnan()isinf()isfinite() - 可能還有其他相關的功能,它們也打破了我沒有測試過。

包裹在括號中的函數/宏的把戲也沒有工作(即(isnan)(x)

刪除-ffast-math作品;-)