package tp1.ex2_2;

import java.lang.Math;

/**
 * Calcule la racine carrée d'un nombre positif
 */
public class Sqrt
{
	public static final double EPSILON = 1e-8;
	
	/**
	 * Cacule la racine carrée d'un nombre positif en utilisant la méhtode
	 * de Newton.
	 * Il s'agit de calculer la racine de l'équation x^2-b=0 avec b
	 * le nombre dont on veut la racine carrée.
	 * La méthode de Newton consiste à utiliser la formule suivante :
	 * x_i = x_(i-1) - f(x_(i-1)) / f'(x_(i-1)).
	 * @param val La valeur dont on cherche la racine carrée (val >= 0)
	 * @return La racine carrée de val avec une précision de 1e-12.
	 * @throws IllegalArgumentException Si val < 0
	 */
	public static double sqrt(double val) throws IllegalArgumentException
	{
		if(val < 0)
			throw new IllegalArgumentException("ne peut pas être négatif");
		if(val == 0 || val == 1)
			return val;

		double curr = nextIteration(val, val);
		while(Math.abs(val - Math.pow(curr, 2)) > EPSILON){
			curr = nextIteration(val, curr);
		}
		return curr;
	}

	private static double nextIteration(double val, double curr){
		return (curr + (val / curr))/2;
	}
}
