Mingw32 std::isnan 与 -ffast-math
我正在使用 -ffast-math
选项编译以下代码:
#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
一起使用。
I am compiling the following code with the -ffast-math
option:
#include <limits>
#include <cmath>
#include <iostream>
int main() {
std::cout << std::isnan(std::numeric_limits<double>::quiet_NaN() ) << std::endl;
}
I am getting 0 as output. How can my code tell whether a floating point number is NaN when it is compiled with -ffast-math
?
Note: On linux, std::isnan
works even with -ffast-math
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于 -ffast-math 指示 GCC 不要处理 NaN,因此预计 isnan() 具有未定义的行为。因此,返回
0
是有效的。您可以使用以下快速替换
isnan()
:Since
-ffast-math
instructs GCC not to handleNaN
s, it is expected thatisnan()
has an undefined behaviour. Returning0
is therefore valid.You can use the following fast replacement for
isnan()
:在 Linux 上,gcc 标志
-ffast-math
会破坏isnan()
、isinf()
和isfinite()
- 可能还有其他我没有测试过的相关功能也被破坏了。将函数/宏括在括号中的技巧也不起作用(即
(isnan)(x)
)删除
-ffast-math
有效;-)On linux, the gcc flag
-ffast-math
breaksisnan()
,isinf()
andisfinite()
- there may be other related functions that are also broken that I have not tested.The trick of wrapping the function/macro in parentheses also did not work (ie.
(isnan)(x)
)Removing
-ffast-math
works ;-)