2013-03-06 2 views
1

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

+3

Ставлю что-нибудь эти значения не равны. Попробуйте напечатать '(x - maxx)'. –

ответ

1

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

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

+0

Спасибо, ребята, вы были абсолютно правы! На самом деле это привело к очень небольшой разнице. Должен ли я переписать сравнение в форме вычитания или есть более элегантный способ решения этого? –

+0

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

1

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

Посмотрите:

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

Смежные вопросы