Как обработать случай, когда заданная точность не может быть достигнута?

К примеру есть такая конструкция :

do {
. . .

} while (fabs(x1 - x) >= eps);

eps задаю с клавиатуры. Но в результате тестирования оказалось, что не во всех случаях может быть достигнута заданная точность и программа просто не выдает результата. Как предусмотреть эту ситуацию?С помощью if-а? С помощью исключений?Если это возможно, то как это можно реализовать? Чтобы выводилось соответствующее сообщение и осуществлялся выход из программы.


Ответы (1 шт):

Автор решения: Ariox

Обычно ставится банальное ограничение на количество итераций. Написать можно по разному, я предпочитаю

constexpr std::size_t IterMax= 9999;
for(std::size_t i = 0; std::abs(x1 - x) >= eps; ++i){
    if(i == IterMax){
        break; // or throw
    }
    ...
}

Но тут возникает вопрос, что вообще означает невозможность достижения требуемой точности. Часто это ошибка в алгоритме, или данные, не удовлетворяющие условию сходимости.

Но может быть и такое, что eps фактически должна зависеть от данных, и вычислить ее заранее невозможно. Тогда можно попробовать использовать относительную ошибку, вроде abs(x1 - x) / max(abs(x1), abs(x)) > 0.1.

Или же можно проверять производную ошибки, тогда расчет заканчивается, когда ошибка перестала уменьшаться: abs(abs(x1 - x) - prevEps) >= dEps . Ну или аналогично можно проверять производную относительной ошибки.

Это все не отменяет необходимости подсчета итераций, иначе сложные модели не отладить.

→ Ссылка