gpt4 book ai didi

c++ - isnan 无法与 `-Ofast` 标志一起正常工作

转载 作者:行者123 更新时间:2023-12-02 21:32:10 24 4
gpt4 key购买 nike

考虑以下测试程序:

# include <gsl/gsl_statistics_double.h>
# include <iostream>

using namespace std;

int main()
{
double y = 50.2944, yc = 63.2128;
double pearson_corr = gsl_stats_correlation(&y, 1, &yc, 1, 1);
cout << "pearson_corr = " << pearson_corr << endl;
if (isnan(pearson_corr))
cout << "It is nan" << endl;
else
cout << "Not nan" << endl;
}

在某种程度上,这段代码有些荒谬,但其目的是显示我遇到的一个微妙的错误。

调用gsl_stats_correlation()应该给出错误,因为样本数为 1 并且 PIL 逊系数对至少两个样本有意义。

当我这样编译时:

c++ test-r2.cc -lgsl -lgslcblas

程序打印出-nan结果和消息“It is nan”,我认为这是正确的,因为正如我所说,不可能计算系数。调用isnan()正确检测结果为nan 。但是,当我这样编译时:

c++ -Ofast test-r2.cc -lgsl -lgslcblas

程序打印出-nan结果但消息“Not nan”,这表明调用 isnan()无法检测pearson_corr的无效性变量。

所以,我的第一个问题是“为什么使用 -Ofast 标志对 isnan() 的调用无法检测到变量是 nan 。我的第二个问题是如何以某种方式解决这个问题独立于给予编译器的优化标志?

我在 ubuntu 16.04 上使用 gnu c++ 5.4.0 版,并在 64 位模式下运行 Intel i5

提前致谢

最佳答案

-Ofast 除其他事项外,还激活 GCC 的 -ffast-math 模式,而 -ffast-math 除其他事项外,还会导致编译器生成假设 NaN(和 Inf)永远不会发生的代码。

因此,如果您需要使用 NaN 或 Inf,则不得使用-Ofast。没有解决方法。

无论如何,几乎所有程序都可以通过 -O2 -march=native 得到更好的服务; -Ofast 打开极其激进的内联和循环展开,根据我的经验,几乎总是会耗尽 I-cache 并使程序变慢

关于c++ - isnan 无法与 `-Ofast` 标志一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com