Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Square root approximation calculator

Tags:

c

do / while loop is infinite and will not break or return proper number, however when printing the variable last_guess inside of the loop, I infinitely get the correct value I want to return.

#include <stdio.h>
#include <math.h>

double square_root(double number, double last_guess) {
    double new_guess = 1;

    if (number >= 0) {
        do {
            new_guess = 0.5 * (last_guess + number / last_guess);

            last_guess = new_guess;

        } while (new_guess > 0.005);
    } else {
        printf("Not a positive integer.");
    }

    if (new_guess < 0.005)  {
        last_guess = roundf(last_guess * 100.0) / 100.0;
        return last_guess;
    }
}

int main() {
    double number, new_guess = 1.0;
    double last_guess = 1.0;

    printf("enter: ");
    scanf("%lf", &number);

    printf("enter: ");
    scanf("%lf", &last_guess);

    double final_value = square_root(number, last_guess);

    printf("%d", final_value);

    return 0;
}
like image 479
Veddersboy Avatar asked Mar 03 '26 08:03

Veddersboy


1 Answers

You should iterate until the difference between successive guesses is small enough, not until the last guess is below the threshold.

Furthermore, you should use %e, %f or %g to convert a double value with printf, not %d.

Here is a modified version:

#include <stdio.h>
#include <math.h>

double square_root(double number, double last_guess) {
    double new_guess = 1;

    if (number >= 0) {
        for (;;) {
            new_guess = 0.5 * (last_guess + number / last_guess);
            if (fabs(new_guess - last_guess) <= 0.00001 * new_guess)
                break;
            last_guess = new_guess;
        }
        return new_guess;
   } else {
        printf("Not a positive integer.");
        return 0;
    }
}

int main() {

    double number, new_guess = 1.0;
    double last_guess = 1.0;

    printf("enter: ");
    scanf("%lf", &number);

    printf("enter: ");
    scanf("%lf", &last_guess);

    double final_value = square_root(number, last_guess);

    printf("%g\n", final_value);

    return 0;
}
like image 68
chqrlie Avatar answered Mar 05 '26 06:03

chqrlie



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!