在GCC上,我们启用-ffast-math
来加速浮点计算。但是,由于我们依赖于NaN和Inf浮点值的正确行为,我们也会启用-fno-finite-math-only
,以便假设值不是NaN / Inf
对于MSVC,"等同于"到-ffast-math
显然是/fp:fast
。但是,与GCC的-ffast-math
一样,also includes假设Nan / Inf不存在的优化{{3}}。 (重要的是,看起来像std :: isnan()这样的测试并不能保证提供准确的结果。)
是否有一个MSVC C ++编译选项,它允许您利用大多数/fp:fast
优化,但仍然可以处理NaN和Inf值"正确"? (或者至少,保证像std :: isnan()/ std :: isinf()这样的测试会检测NaN / Inf,如果它们恰好生成的话。)
答案 0 :(得分:1)
guarantees that tests like std::isnan()/std::isinf()
与GCC不同,MSVC(CL RC 19)实际上并未在std::isnan
设置上优化/fp:fast
:
另一个永远不会优化的替代方案是调用C99 isnan
或MSVC内在_isnanf
。或者针对已知的位掩码推送您自己的nan
测试,该位掩码可以使用std::numeric_limits::quiet_NaN
生成。