У меня есть вопрос, который кажется мне очень необычным. У меня есть условие условия, которое не работает, как должно. В частности, у меня есть
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
в декларации. Это исправило некоторые места (я использую эту функцию более одного раза), но не все из них.
Похоже на неточность с плавающей запятой. Попробуйте распечатать значения без ограничения числа десятичных разрядов или печати (x-maxx)
как предложил Оли Чарльзуорт.
Обычное решение этой проблемы заключается в применении небольшого «эпсилона» для сравнений.
С плавающей точкой сложное дело, особенно при сравнении значений. Если значения очень близки, они могут печатать одинаково, но все равно будут разными.
Посмотри на: