【发布时间】:2017-12-07 20:43:17
【问题描述】:
考虑以下测试程序:
# 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,并且 pearson 系数对至少两个样本有意义。
当我这样编译时:
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 版,Intel i5 以 64 位模式运行
提前致谢
【问题讨论】:
-
“fast-math 可能导致依赖于数学函数的 IEEE 或 ISO 规则/规范的精确实现的程序的错误输出”,来自 stackoverflow.com/questions/15944614/…
-
在这两种情况下检查
fpclassify(pearson_corr)的值。