C ++ Поиск квадратного корня без сбоев цикла функции sqrt

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

У меня проблемы с циклом. Когда я спрашиваю о квадратном корне из 67, он находит его, но повторяет правильный ответ 3 раза.

Enter a value to be square rooted:
67
33.5
guess = 17.75
guess = 10.7623
guess = 8.49387
guess = 8.19096
guess = 8.18535
guess = 8.18535
guess = 8.18535
The program took 7 guess to find an estimation.

Когда я пытаюсь найти квадратный корень из 5, он находит его, но продолжает бесконечно зацикливаться

using namespace std;

int main()
{
double guess2;
double squarenumber;
double guess1;
int numofguess = 0;

cout << "Enter a value to be square rooted: " << endl;
cin >> squarenumber;
guess1 = squarenumber/2;
cout << guess1 << endl;

do
{

guess2 = (guess1 - (((guess1 * guess1) - squarenumber)/(2* guess1)));
guess1 = guess2;

cout << "guess = " << guess2 << endl;

numofguess = numofguess + 1;

} while ((guess2 * guess2) > squarenumber);

cout<< "The program took "<< numofguess <<" guess to find an estimation.";

return 0;
}

1

Решение

Я думаю, что то, чего вам не хватает, это правильное условие выхода.
Ваш код написан для бесконечного цикла, пока догадка не станет «идеальной».
У вас должна быть проверка состояния выхода, если текущее предположение совпадает с предыдущим, что, очевидно, означает, что вы не добьетесь большего успеха.
Вот мое предложение на основе вашего кода:

using namespace std;

int main()
{
double guess2;
double squarenumber;
double guess1;
int numofguess = 0;

cout << "Enter a value to be square rooted: " << endl;
cin >> squarenumber;
guess2 = guess1 = squarenumber/2;
cout << guess1 << endl;

const double epsilon = squarenumber * 1E-6;
do
{
guess1 = guess2;
guess2 = (guess1 - (((guess1 * guess1) - squarenumber)/(2* guess1)));cout << "guess = " << guess2 << endl;

numofguess = numofguess + 1;

} while ((guess2 * guess2) > squarenumber && fabs(guess2-guess1) > epsilon);

cout<< "The program took "<< numofguess <<" guess to find an estimation.";

return 0;
}
1

Другие решения

Ответ Микаэля С. Гимарайнша в основном правильный, проверьте значение эписолона (абсолютное отличие от правильного ответа и вашего ответа). Но «(думаю2 * думаю2)> квадратное число» должен быть полностью удален. Это связано с тем, что теоретически значение может превышать допустимое значение и быть слишком низким. Алгоритм на самом деле идет вверх, если значение слишком низкое. например если вы хотите, чтобы SQRT (25) и ваш прогноз «guess1» был слишком низким на 2, тогда предположим, что равна 2

(2 - (((2 * 2) - 25)/(2* 2))) = 7.25;

И на следующей итерации затем падает до 6,725624, поэтому движется в правильном направлении. Низкие значения на самом деле повышаются и в конечном итоге приближаются к цели. Остановившись, если значение упадет ниже истинного SQRT, вы можете получить «ложные срабатывания», где слишком низкие значения принимаются как достаточно точные.

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

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

std::cout << std::fixed; // force all values to show to the same decimals
std::cout << std::setprecision(6); // set how many places to show

Этот код может быть передан в одну команду перед значением для печати, а также:

std::cout << std::fixed << std::setprecision(6) << "guess = " << guess2 << endl;
0

По вопросам рекламы [email protected]