【问题标题】:Nan behaves differently in #pragma cppNan 在#pragma cpp 中的行为不同
【发布时间】: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 的概念) .
  • 谢谢。知道了。

标签: c++ nan pragma


【解决方案1】:

-Ofast 打开 -ffast-math,它打开 -ffinite-math-only,它执行以下操作(来自此处的 gcc 文档:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

-仅有限数学

允许优化浮点运算,假设 参数和结果不是 NaN 或 +-Infs。

任何 -O 选项都不会打开此选项,因为它可能导致 依赖于精确实现的程序的错误输出 数学函数的 IEEE 或 ISO 规则/规范。它可能, 但是,为不需要的程序生成更快的代码 这些规格的保证。

我认为“-O 选项”部分是错误的,因为 -Ofast 文档说它“无视严格的标准合规性”。那,或者“任何-O选项”,它们的意思是-O1、-O2、-O3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多