Проблема в накоплении погрешности 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 итераций, а момент достижения нужной точки определяется индексом. Для произвольных входных вещественных данных выбирают абсолютный и относительный допуск по смыслу задачи, а не универсальное сравнение на равенство.