Выявление ошибок в программе

Проблема в накоплении погрешности double: шаг 0.2 не представляется точно, поэтому сравнение val == 2.0 ненадёжно. Счётчик цикла лучше сделать целочисленным.

Короткий ответ

Что ответить на собеседовании

Проблема в накоплении погрешности double: шаг 0.2 не представляется точно, поэтому сравнение val == 2.0 ненадёжно. Счётчик цикла лучше сделать целочисленным.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо проанализировать приведённый фрагмент кода и указать, какие логические или технические проблемы в нём присутствуют.

#include <iostream>
#include <cmath>

int main(void) {
    const int N = 100;
    const double Y = 20;
    const double step = Y / N;

    for (double val = Y; val > 0; val -= step) {
        std::cout << val << " ; ";
        if (val == 2.0)
            std::cout << "Это нужная величина: " << val << std::endl;
    }

    std::cout << std::endl;
}

Ответ

Проблема в накоплении погрешности double: шаг 0.2 не представляется точно, поэтому сравнение val == 2.0 ненадёжно. Счётчик цикла лучше сделать целочисленным.

Количество итераций и нужный шаг можно задать явно:

for (int i = 0; i < N; ++i) {
    double val = Y * (N - i) / N;
    std::cout << val << " ; ";
    if (i == 90)
        std::cout << "Это нужная величина: " << val << '\n';
}

Теперь будет ровно 100 итераций, а момент достижения нужной точки определяется индексом. Для произвольных входных вещественных данных выбирают абсолютный и относительный допуск по смыслу задачи, а не универсальное сравнение на равенство.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее