Цикл for не совершает последнюю итерацию
Столкнулся с проблемой в следующем коде:
#include<cmath>
using namespace std;
int main() {
setlocale(LC_ALL, "rus");
double b, x;
cout << "Введите значение b: ";
cin >> b;
double U;
for (x = 2; x <= 4; x += 0.2)
{
if (x < 3)
U = 2.75 * log(abs(b * x)) - sqrt(abs(log(x + b)));
else if (x == 3.)
U = x - 2. * sin(b / x);
else
U = exp(x) + log(x) - (10 * x);
cout << "x = " << x << endl;
cout << "U = " << U << endl << endl;
}
}
Код работает, но цикл не совершает последнюю итерацию. При этом, если я делаю следующую конструкцию, код работает правильно:
for (x = 2; x <= 4;)
{
x += 0.2;
}
Почему цикл for не совершает последнюю итерацию?
Ответы (1 шт):
Проблема тут в том, что 2 + 0.2 + 0.2 + 0.2 + 0.2 + 0.2 + 0.2 + 0.2 + 0.2 + 0.2 + 0.2 равно 4.000000000000002, что больше 4. Из-за этого последняя итерация и пропускается.
Подробнее можно почитать тут: Вычисления на числах с плавающей точкой работают неправильно
Чтобы избежать такого эффекта, надо ослабить условие. Например, можно оставить уступку в половину шага:
for (x = 2; x < 4.1; x += 0.2)
Или же можно попробовать округлять x до десятых перед сравнением:
for (x = 2; round(x*10)/10 <= 4; x += 0.2)
Наконец, самый надёжный вариант - считать в целых числах:
for (int xn = 20; xn <= 40; xn += 2) {
double x = xn / 10.0;
}