MSVC相当于GCC的-fno-finite-math-only?

R.M*_*.M. 10 c++ ieee-754 visual-c++

在GCC上,我们可以-ffast-math加速浮点计算.但是当我们依赖于NaN和Inf浮点值的正确行为时,我们也会打开-fno-finite-math-only,因此假设值不是NaN/Inf的优化

对于MSVC来说,-ffast-math显然是"等同" /fp:fast.但是,与GCC一样-ffast-math,它还包括假设Nan/Inf不存在的优化.(重要的是,似乎测试像std :: isnan()不能保证给出"准确"的结果.)

是否有一个MSVC C++编译选项,它允许您利用大多数/fp:fast优化,但仍然"正确"处理NaN和Inf值?(或者至少,保证像std :: isnan()/ std :: isinf()这样的测试会检测NaN/Inf,如果它们恰好被生成了.)

Mik*_*ail 2

guarantees that tests like std::isnan()/std::isinf()
Run Code Online (Sandbox Code Playgroud)

与 GCC 不同,MSVC (CL RC 19) 实际上并没有优化std::isnan设置/fp:fast

另一种永远不会被优化的替代方法是调用 C99isnan或 MSVC 内在函数_isnanf。或者nan针对已知的位掩码进行您自己的测试,该位掩码可以使用std::numeric_limits::quiet_NaN.

参见: https: //godbolt.org/g/YdZJq5