Операторы условия (‹ , ›) не работают в функции интерполяции gsl

У меня вопрос, который кажется мне очень необычным. У меня есть оператор условия, который не работает должным образом. В частности, у меня

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

где v1 — вектор. Странная вещь - это вывод: он дает мне равные числа, т.е.

168.68 168.68

Это утверждение связано с функцией интерполяции gsl. Фактически, он дублирует оператор в interp.c:150, что вызывает ошибку gsl: interp.c:150: ERROR: interpolation error. Поэтому, когда число, которое должно быть выполнено, обычно приходит к функции, оно на самом деле дает true вместо false, и я понятия не имею, почему, поскольку число (x) фактически равно максимально допустимому значению.

P.S.: Я проверил оператор if сам по себе (с элементарными записями), и, кажется, он работает нормально.

P.P.S.: Кусок кода от 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 в объявлении. Это исправило некоторые места (я использую эту функцию не раз), но не все.


person Eugene B    schedule 06.03.2013    source источник
comment
Держу пари, что эти значения не равны. Попробуйте распечатать (x - maxx).   -  person Oliver Charlesworth    schedule 06.03.2013


Ответы (2)


Похоже на неточность с плавающей запятой. Попробуйте распечатать значения, не ограничивая количество знаков после запятой, или напечатать (x-maxx), как предложил Оли Чарльзуорт.

Обычным решением такого рода проблем является применение небольшого «эпсилон» к сравнениям.

person Jack Aidley    schedule 06.03.2013
comment
Спасибо, ребята, вы были абсолютно правы! На самом деле он вернул очень небольшую разницу. Должен ли я тогда переписать сравнение в форме вычитания или есть более элегантный способ решить эту проблему? - person Eugene B; 06.03.2013
comment
Учитывая, что maxx является жестким пределом, я не вижу, что вы могли бы сделать. Я полагаю, вы могли бы ограничить значения, близкие к maxx, скажем, ‹ maxx + 0,0001 или что-то в этом роде, в зависимости от вашего приложения. - person Jack Aidley; 06.03.2013

Работа с плавающей запятой — сложная задача, особенно при сравнении значений. Если значения очень близки, они вполне могут печатать одинаково, но все же отличаться.

Посмотри на:

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

person Mats Petersson    schedule 06.03.2013