1

私には非常に珍しいと思われる質問があります。正常に機能しない条件ステートメントがあります。特に、私は

double maxx = *max_element(v1.begin(), v1.end());
if(x > maxx){
    cout << x << "\t" << maxx << endl;
    }

v1ベクトルです。奇妙なのは出力です。それは私に等しい数を与えます、ig

168.68 168.68

このステートメントは、gsl 補間関数に関連しています。実際には、ステートメントが重複しinterp.c:150ているため、エラーが発生しますgsl: interp.c:150: ERROR: interpolation error。したがって、通常実行されるべき数値が関数に来ると、true代わりに実際に与えられますfalseが、数値 (x) は実際には許可されている最大値に等しいため、その理由はわかりません。

PS:ifステートメントを単独で (基本的なエントリで) チェックしたところ、正常に動作しているようです。

PPS: からのコードinterp.c:

double gsl_interp_eval (const gsl_interp * interp,
                const double xa[], const double ya[], double x,
                gsl_interp_accel * a){

 double y;

 int status;

 if (x < interp->xmin || x > interp->xmax)
   {
     GSL_ERROR_VAL("interpolation error", GSL_EDOM, GSL_NAN);
   }

 status = interp->type->eval (interp->state, xa, ya, interp->size, x, a, &y);

 DISCARD_STATUS(status);

 return y;}

x = interp->xmaxそのため、絶対にすべきではありませんが、でもエラーを返します。

更新:宣言に変更doubleしました。long doubleこれによりいくつかの場所が修正されましたが (私はこの機能を複数回使用しています)、すべてではありません。

4

2 に答える 2

1

浮動小数点は、特に値を比較する場合に、注意が必要です。値が非常に近い場合、同じように出力される可能性がありますが、それでも異なります。

見て:

http://floating-point-gui.de/

于 2013-03-06T18:31:00.020 に答える
1

浮動小数点の不正確さのように見えます。(x-maxx)Oli Charlesworth が提案するように、小数点以下の桁数を制限したり印刷したりせずに値を印刷してみてください。

この種の問題に対する通常の解決策は、比較に小さな「イプシロン」を適用することです。

于 2013-03-06T18:29:47.700 に答える