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

看起来像浮点数不准确。尝试在不限制小数位数的情况下打印值或(x-maxx)按照 Oli Charlesworth 的建议打印。

此类问题的通常解决方案是在比较中应用一个小的“epsilon”。

于 2013-03-06T18:29:47.700 回答
1

浮点是一项棘手的工作,尤其是在比较值时。如果值非常接近,它们很可能打印相同,但仍然不同。

看一下:

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

于 2013-03-06T18:31:00.020 回答