2016-04-01 6 views
1

Я пытаюсь вычислить квадратный корень из числа, используя функцию, содержащую цикл while. В условиях цикла while я хочу сравнить абсолютное значение отношения двух значений, угаданного квадратного корня и числа, до 1. Однако, всякий раз, когда я запускаю программу, я продолжаю получать бесконечный цикл, выводящий 1.414214. Любая помощь? Благодарю.Использование цикла while для вычисления аппроксимации квадратного корня из числа

// Function to calculate the absolute value of a number 

#include <stdio.h> 

float absoluteValue (float x) 
{ 
    if (x < 0) 
     x = -x; 
    return (x); 
} 

// Function to compute the square root of a number 

float squareRoot (float x, const float epsilon) 
{ 
    float  guess = 1.0; 

    while (absoluteValue ((guess * guess)/x) != epsilon) { 
     guess = ((x/guess) + guess)/2.0; 
     printf("%f\n", guess); 
    } 

     return guess; 
} 

int main (void) 
{ 
    printf ("squareRoot (2.0) = %f\n", squareRoot (2.0, 1.0)); 
    printf ("squareRoot (144.0) = %f\n", squareRoot (144.0, 1.0)); 
    printf ("squareRoot (17.5) = %f\n", squareRoot (17.5, 1.0)); 

    return 0; 
} 
+2

Подсказка. Тестирование значений с плавающей запятой для точного равенства почти всегда является ошибкой. –

+1

Ваша петля никогда не заканчивается, потому что условие петли не выполняется. Узнайте, почему он не удовлетворен. Если он должен быть удовлетворен. – Imprfectluck

+1

Добавьте это в свой цикл while, если вы хотите увидеть, почему: 'printf ("% f \ n ", absoluteValue ((угадать * угадать)/x));' –

ответ

4

Изменить это:

while (absoluteValue ((guess * guess)/x) != epsilon) { 

To:

while (absoluteValue ((guess * guess)/x - 1.0) > epsilon) { 

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

Вы также захотите использовать значительно меньшие значения для epsilon, например. 0.000001

+0

Или 'fabs (guess * guess-x)> epsilon', если вы хотите абсолютную погрешность (например, +/- 0.01 вместо +/- 1%). – MooseBoys

+0

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