2015-02-12 3 views
0

Это широкий вопрос, с конкретным примером. Мой вопрос: как вы оцениваете, как оценивать алгоритм или выражение в цикле?Вычисление выражения для вычисления цикла

В примере beblow я выяснил, как использовать цикл для вычисления квадратного корня с помощью счетчика с алгоритмом babylonian и, похоже, работает нормально.

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

Вот мой счетчик версия:

int count(20); 

    while (count > 0) 
{ 
    if (guess <= (guess * p) + guess) 
     prevGuess = guess; 
    else 
     r = input/guess; 

    guess = (guess + r)/2.0; 
    count -= 1; 
    cout << "\nGuess = " << guess; 
} 

Я пытался делать такие вещи, как:

while ((guess - lastGuess)/lastGuess) 

и

while(guess - lastGuess * .01) 

Но я либо получить только один Интерактивный или бесконечную петля.

Что такое хороший метод для вычисления алгоритма внутри цикла?

И я не имею в виду только для этой маленькой программы, я имею в виду что-либо, даже что-то вроде х + у = 2.

Вы бы сделать что-то вроде:

while(x + y !=2) {} 

Спасибо!

+1

Итак, ваш вопрос заключается в том, как вы пишете цикл, чтобы оно выполнялось до тех пор, пока конкретное выражение не будет истинным/ложным? – ahjohnston25

+1

Избегайте сравнения для равенства с плавающей запятой. – Jarod42

+0

@ ahjohnston25 да, в принципе, спасибо – SkyeBoniwell

ответ

1

Вам необходимо сравнить вашу ошибку с вашим допустимым пределом ошибки, а не с ошибкой, которую вы пытаетесь использовать.

Вы бы использовать

while (abs((guess - lastGuess)/lastGuess) > .01) 

для относительной погрешности .01 и

while(abs(guess - lastGuess) > .01) 

для абсолютного одного.

+0

вы бы обновили переменные в цикле: \t \t r = ввод/угадание; \t \t guess = (guess + r)/2; lastGuess = guess; – SkyeBoniwell

+0

как вы это поняли? Глядя на алгоритм, как вы его знаете, чтобы оценить его с помощью (guess - lastGuess)/lastGuess> .01? Спасибо – SkyeBoniwell

+1

@ 999cm999 Почти - вы должны сохранить старое предположение ('lastGuess = guess;'), прежде чем вычислять новый. – molbdnilo

2

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

for(;;) { 
    double next_v = (v + (n/v))/2; 
    if (fabs(v - next_v) < eps) break; // We got there 
    v = next_v; 
} 

, где eps - это то, что вы хотите в результате.

1

В то время как (и каждый цикл) есть условие, которое сообщает программе, когда это необходимо остановить. Это условие должно быть некоторым выражением, которое возвращает истинное или ложное значение. Проще говоря, это просто уравнение или что-то, что дает ясный ответ: истинный или ложный. В вашем примере выражение вроде: ((guess - lastGuess)/lastGuess) не возвращает ни true, ни false. Он возвращает некоторые числа и т. Д. Выражение вроде ((guess - lastGuess)/lastGuess) == 4 вернет true, если ((guess - lastGuess)/lastGuess) будет равно 4 и false, если нет. Этот пример будет работать: while(x + y !=2). Программа будет вызывать цикл до тех пор, пока x + y не станет равным 2.