【发布时间】:2022-10-01 00:35:10
【问题描述】:
我正在学习 NaN 数据类型,因此,我运行了一个代码来理解它,它运行良好,代码按预期工作,但是当我在我的代码中添加一行 #pragma GCC optimize(\"Ofast\") 时,它的行为出乎意料。我很好奇为什么??
#pragma GCC optimize(\"Ofast\")
// C++ code to check for NaN exception
// using \"==\" operator
#include <cmath>
#include <iostream>
using namespace std;
// Driver Code
int main()
{
float a = sqrt(2);
float b = sqrt(-2);
// Returns true, a is real number
// prints \"Its a real number\"
a == a ? cout << \"Its a real number\" << endl
: cout << \"Its NaN\" << endl;
// Returns false, b is complex number
// prints \"Its nan\"
b == b ? cout << \"Its a real number\" << endl
: cout << \"Its NaN\" << endl;
return 0;
}
没有编译指示的输出是
Its a real number
Its NaN
但是在使用 pragma 之后,它给出了
Its a real number
Its a real number
-
-Ofast 在忽略对标准(如 IEEE-754)的遵从性的情况下使事情变得更快,因此 NaN 在该优化下无法正常工作也就不足为奇了,尽管它可能会根据您的 gcc 版本而有所不同。另外,NaN 不是它自己的“数据类型”,它只是一个可能的浮点值(至少在 IEEE-754 中是这样,其他一些浮点数系统没有 NaN 的概念) .
-
谢谢。知道了。