Поиск квадратного корня с помощью итераций в c ++

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

Затем следует построить цикл, управляемый подсчетом; он будет выполняться один раз для каждой желаемой десятичной позиции; в этом примере этот цикл будет выполняться четыре раза (по одному разу для десятых, сотых, тысячных и десятитысячных знаков после запятой). Используйте счетчик, например decimalPosition, чтобы отслеживать, на каком проходе находится цикл.

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

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }

}

вот мой результат до сих пор

Enter a number you wish to know the square root of: 8
Enter the number of decimal places of accuracy you want: 7
Find the square root of 8 to 7 decimal places: 
2.6000000
2.7000000
2.8000000
2.9000000
2.9000000 square root of 8.0000000

person faustborne    schedule 19.09.2012    source источник
comment
Можете ли вы удалить тег домашнего задания - он устарел   -  person Adrian Cornish    schedule 19.09.2012
comment
@AdrianCornish думает, что его больше нет, все равно я его сейчас не вижу :)   -  person Arnab Datta    schedule 19.09.2012
comment
Вы, конечно, понимаете, что то, что у вас есть до сих пор, совершенно неверно. Это не квадратный корень из 8-7 десятичных знаков.   -  person duffymo    schedule 19.09.2012
comment
Я действительно это понимал, и именно поэтому я задал этот вопрос раньше, но с тех пор я обнаружил свою проблему, которая заключалась в неисправном цикле с управлением счетчиком. Спасибо всем, кто пытался мне помочь!   -  person faustborne    schedule 20.09.2012


Ответы (2)


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

PS - Вавилоняне открыли это первыми, но Ньютон получил за это признание.

person duffymo    schedule 19.09.2012
comment
Не заставляйте меня говорить о вавилонянах. - person Steve Wellens; 19.09.2012
comment
Я правильно понял математику. Я обнаружил, что неправильно реализовал свои циклы. мой цикл, управляемый счетчиком, не был инициализирован должным образом. Теперь мой код волшебным образом находит квадратные корни с помощью этого метода. Это довольно красиво !! - person faustborne; 20.09.2012

Чтобы ваш цикл работал, вы можете добавить оператор

baseRoot = baseRoot + (pow((.1),decimalPosition));

после цикла while, потому что вам нужно убедиться, что baseRoot больше, чем ответ перед каждой итерацией. Нравится:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }
    baseRoot = baseRoot + (pow((.1),decimalPosition));
}

Теперь вы можете получить ответ 2.8284271.

Кстати, есть еще один эффективный способ, называемый методом деления пополам (аналогичный двоичному поиску) для решения такого рода проблем (связанных с Монотонной функцией) без особых математических вычислений:

double mySqrt(double x, double epsilon) {
    double left = 0, right = x;
    while (right - left > epsilon) {
        double mid = (left + right) / 2;
        if (mid * mid > x) {
            right = mid;
        } else {
            left = mid;
        }
    }
    return left;
}

Это просто, глупо :)

person Joe Liu    schedule 20.09.2012