#include <stdio.h>

/* Déclaration de la fonction my_sqrt() :
Fonction récursive qui calcule et renvoie une valeur approchée de la racine carrée de x
- paramètre x : nombre réel dont on cherche la racine carrée
- paramètre v1 : borne inférieure de l'intervalle de recherche
- paramètre v2 : borne supérieure de l'intervalle de recherche  
- paramètre e : valeur maximale de l'erreur commise
- valeur de retour : une valeur approchée de la racine carrée de x*/
double my_sqrt(double x, double v1, double v2, double e);

/* Déclaration de la fonction my_sqrt_2() :
Fonction non récursive qui calcule et renvoie une valeur approchée de la racine carrée de x
- paramètre x : nombre réel dont on cherche la racine carrée
- paramètre v1 : borne inférieure de l'intervalle de recherche
- paramètre v2 : borne supérieure de l'intervalle de recherche  
- paramètre e : valeur maximale de l'erreur commise
- valeur de retour : une valeur approchée de la racine carrée de x*/
double my_sqrt_2(double x, double v1, double v2, double e);

int main()
{
    double x, y;
	printf("--> saisir x : ");
	scanf("%lf", &x);
    y = my_sqrt(x, 0.0, 1.0, 0.0001);
    printf("y = %f\n", y);
    y = my_sqrt_2(x, 0.0, 1.0, 0.0001);
    printf("y = %f\n", y);
    return 0;
}

double my_sqrt(double x, double v1, double v2, double e)
{
    double y, m;
    //printf("v1 = %f, v2 = %f\n", v1, v2); //pour debug
    m = (v2 + v1)/2;
    if (v2 - v1 > e)
    {
        if (m*m > x)
        {
            y = my_sqrt(x, v1, m, e);
        }
        else
        {
            y = my_sqrt(x, m, v2, e);
        }
    }
    else
    {
        y = m;
    }
    // l'algo s'arrête dès que v2 - v1 <= e, et il renvoie (v2 + v1)/2
    return y;
}


double my_sqrt_2(double x, double v1, double v2, double e)
{
    double m;
    do
    {
        //printf("v1 = %f, v2 = %f\n", v1, v2); //pour debug
        m = (v2 + v1)/2;
        if (m*m > x)
        {
            v2 = m;
        }
        else
        {
            v1 = m;
        }
    }
    while (v2 - v1 > e);
    m = (v2 + v1)/2; // pour obtenir le même résultat que la fonction récursive
    return m;
}

