Мне дали задание, которое требует от меня использовать интервальную деление пополам для вычисления квадратного корня из значения в пределах 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;
}
Вы включаете 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
станут на каждой итерации, проблема была бы очень ясной.
вы хотите while(fabs((mid * mid) - x) > 10E-12)
? несбалансированные круглые скобки? Вы всегда получите что-то для этого....
Кроме того, вы хотели бы сделать, if(...){}else if(...){}
? У вас есть >
и <
условия в вашем потоке if
, но что происходит, когда это ==
. В C/C++ 3 НЕ> 3, а также 3 НЕ <3. 3 ТОЛЬКО КОГДА-ЛИБО == 3 Приходилось ли вам когда-либо встречаться :)?
Как насчет выполнения if(>=){} else if(<)
? Кроме того, отладчик - ваш хороший друг - не забывайте, что :)
if(..){}else if(...){}
потому что в какой-то момент вы закончите оба раза, if
s ..... Проверьте мой обновленный ответ. Кроме того, файл .hh
? Я мог бы быть немного устаревшим для расширений файла C ++ в этом случае :(