`で正常に動作しません:いくつかの方法でISNANには、次のテストプログラムを検討-Ofast`フラグ
# 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でピアソン係数が少なくとも2つのサンプルの感覚を持つため、エラーが発生します。
は、私はこのようにコンパイルするとき:
c++ test-r2.cc -lgsl -lgslcblas
プログラムが出力した結果、私が言ったように、係数を計算することはできませんので、私が正しい考えるメッセージ「それがNaNである」、など-nan
。 isnan()
を呼び出すと、結果はnan
であることが正しく検出されます。しかし、私はこのようにコンパイル:
c++ -Ofast test-r2.cc -lgsl -lgslcblas
プログラムは、その結果が、isnan()
への呼び出しがpearson_corr
変数の無効を検出することができなかったことを示唆しているメッセージが「未ナン」、として-nan
を出力します。
だから、私の最初の質問は、なぜ-Ofast
フラグでisnan()
への呼び出しは、変数がnan
であることを検出することができません。そして、私の2番目の質問は、最適化フラグに依存しない方法でこの問題を解決する方法だろう」ESコンパイラに与えられた
私は64ビットモードでのUbuntu 16.04上のGNU C++バージョン5.4.0およびインテルi5の実行を使用しています事前に
おかげ
「高速数学は、プログラムの誤った出力につながることができます数学関数のIEEEまたはISOルール/仕様の正確な実装に依存しています」https://stackoverflow.com/questions/15944614/is-it-possible-to-make-isnan-work-in-gfortran-o3- ffast-math –
どちらの場合でも 'fpclassify(pearson_corr) 'の値を確認してください。 –