У меня есть массив значений «x» (сетка для решателя PDE), который, когда я перехожу к функции, которая заполняет другой массив на основе этих значений x, одно значение x не оценивается должным образом. Диапазон значений x равен -1: 1 с шагом 0,0125, а при x = -0,5 и при x = 0,5 мне нужно обрабатывать эти случаи иначе, чем другие значения. Однако нижеприведенный блок не может оценить TRUE для точки x = 0,5 (это нормально для x = -0,5). Вот урезанная фрагмент блока проблем, с деталями следовать:Если оператор не оценивает TRUE, когда он должен
int N = 160;
double delta_x = 0.0125;
const double lims = 0.5 * delta_x;
for(int i = 0; i <= N; i++)
{
if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;
else if((abs(x[i] + 0.5) < lims) || (abs(x[i] - 0.5) < lims)) sol[i] = 0.5;
else sol[i] = 1;
cout << setprecision(30) << "lims: " << lims << ", abs(x[i] - 0.5): " << abs(x[i] - 0.5) << endl;
cout << "sol[" << i << "]: " << sol[i] << endl;
}
Вот выход при й = 0,5:
lims: 0.00625000000000000034694469519536, abs(x[i] - 0.5): 1.11022302462515654042363166809e-16
sol[120]: 0
Таким образом, это выглядит как выражение в if-заявлении должен возвращать TRUE при x = 0,5, хотя это, конечно, не 0,5, так как оно находится в пределах «пределов» диапазона. Есть предположения??
Это конечно выглядит совсем по-одной ошибки для меня. Конечно, это должно быть
Просто проверка - вы включаете 'cmath.h'? 'abs' только перегружен для удваивания в том, что' stdlib' объявляет int-only 'abs'. – usr2564301
Просьба уточнить, что не работает, как вы ожидаете. В примере вывода 1е-16, безусловно, находится в пределах допуска «lims». – MooseBoys