Операторы условий (& lt;, & gt;) не работают в функции интерполяции 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 и я понятия не имею, почему, поскольку число (х) фактически равно максимально допустимому значению.

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

1

Решение

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

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

1

Другие решения

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

Посмотри на:

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

1

По вопросам рекламы [email protected]