Безостановочный цикл пока не получен ожидаемый результат

0

Мне дали задание, которое требует от меня использовать интервальную деление пополам для вычисления квадратного корня из значения в пределах 10e-12. У меня есть мой код здесь, и он не возвращает никаких ошибок при компиляции, но он работает около 5 минут и не вернул результат. Что я тут сделал? Вот мой код.

#include "fcpp.hh"

double biit(double min, double max, double x)
{
    double mid = (max + min) / 2;

    while(fabs((mid * mid) - x) > 10E-12)
    {
        if(mid * mid > x)
        {
            min = min;
            max = mid;
            mid = (min + max) / 2;
        }

        else if(min * min < x)
        {
            min = mid;
            max = max;
            mid = (min + max) / 2;
        }
    }

    return mid;
}

int main()
{
    print(biit(enter_doub("interval min:"), enter_doub("interval max:"), enter_doub("take square root of:")));  

    return 0;
}
Теги:
while-loop

2 ответа

2
Лучший ответ

Вы включаете min*min с обеих сторон x а не mid*mid. Рассмотрите, что происходит, когда вы пытаетесь найти квадратный корень из 4 ограниченных 1 и 10:

biit(1, 10, 4);

При первом вызове кортеж (min, mid, max) равен: (1, 5.5, 10). Так как 5.5 - это плохая догадка, вы итерации вперед... но вместо того, чтобы итерировать ниже, вы повторяетесь выше... вы используете свою вторую ветвь, поэтому ваш кортеж становится (5.5, 7.75, 10). На данный момент у вас нет надежды на успех, так как ваш min уже больше вашего ответа.

Изменить на:

if (mid * mid > x) {
    max = mid;
}
else {
    min = mid;
}

mid = (min + max) / 2;

Кстати, если вы попытались отладить это вообще, распечатав, какие min, mid и max станут на каждой итерации, проблема была бы очень ясной.

  • 0
    Это исправило это :) Я не видел, чтобы я ставил два минимальных значения вместо средних значений. Спасибо!
-1

вы хотите while(fabs((mid * mid) - x) > 10E-12)? несбалансированные круглые скобки? Вы всегда получите что-то для этого....

Кроме того, вы хотели бы сделать, if(...){}else if(...){}? У вас есть > и < условия в вашем потоке if, но что происходит, когда это ==. В C/C++ 3 НЕ> 3, а также 3 НЕ <3. 3 ТОЛЬКО КОГДА-ЛИБО == 3 Приходилось ли вам когда-либо встречаться :)?

Как насчет выполнения if(>=){} else if(<)? Кроме того, отладчик - ваш хороший друг - не забывайте, что :)

  • 0
    Я не уловил это, спасибо. Это все еще не возвращает результат для меня, все же.
  • 0
    @ NigelTh0rnberry Кроме того, вы имели в виду if(..){}else if(...){} потому что в какой-то момент вы закончите оба раза, if s ..... Проверьте мой обновленный ответ. Кроме того, файл .hh ? Я мог бы быть немного устаревшим для расширений файла C ++ в этом случае :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню