0

Столкнулся с проблемой в следующем коде:

#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 &lt; 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 &lt;&lt; &quot;x = &quot; &lt;&lt; x &lt;&lt; endl;
    cout &lt;&lt; &quot;U = &quot; &lt;&lt; U &lt;&lt; endl &lt;&lt; endl;
}

}

Код работает, но цикл не совершает последнюю итерацию. При этом, если я делаю следующую конструкцию, код работает правильно:

for (x = 2; x <= 4;)
    {
     x += 0.2;
    }

Почему цикл for не совершает последнюю итерацию?

  • 1
    Итерироваться числами с точкой - ОЧЕНЬ плохая идея. Лучше переходите на int и внутри цикла его как надо делите (на 5). – Kromster Sep 16 '22 at 14:07

1 Answers1

4

Проблема тут в том, что 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;
}
Pavel Mayorov
  • 58,537