2

次のコードを-ffast-mathオプション付きでコンパイルしています。

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

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

出力として0を取得しています。コードを使用してコンパイルしたときに、浮動小数点数がNaNであるかどうかをコードでどのように判断できますか-ffast-math

注:Linuxでは、std::isnanは-ffast-mathでも機能します。

4

2 に答える 2

10

-ffast-mathsを処理しないようにGCCに指示するため、未定義の動作NaNが予想されます。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
于 2011-09-17T14:26:50.947 に答える
1

Linuxでは、gccフラグが-ffast-math壊れます。またisnan()、テストしていない他の関連関数も壊れている可能性がありますisinf()isfinite()

関数/マクロを括弧で囲むトリックも機能しませんでした(つまり(isnan)(x)

作品の削除-ffast-math;-)

于 2011-09-21T21:34:45.233 に答える