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


int main( void )
{
	double x ; /*  Liczba której pierwiastek policzymy  */
	int k ; /*  Potęga 4, przez którą dzielimy a aby wylądowała  */
	          /*  w przedziale [1,4)  */
	double y_stary,y_nowy; /*  Dwa kolejne przybliżenia pierwiastka  */
	double eps=100*DBL_EPSILON; /*  Dokładność, z którą będziemy obliczać pierwiastek  */
	short int minus; /*  Flaga, którą ustawimy (=1), jeżeli podana liczba jest ujemna  */
	char test='t'; /*  Służy do sprawdzania, czy użytkownik chce kontynuować  */


	printf("\nObliczanie pierwiastka kwadratowego liczby\n\n\n");
	while (test=='t')
	{
		k=0;
		minus=0;
		printf("Proszę podać liczbę rzeczywistą x:\n");
		scanf("%lf" , &x );
		if ( x < 0 )
		{
			minus=1;
			x=-x;
		}

    	  /*  W tym momencie x jest na pewno nieujemna  */

		if (x > 0)
		{
			while (x >= 4)
			{
				x=x/4;
				k++;
			}

    	  /*  W tym momencie x jest mniejsza od 4, a k reprezentuje potęgę 4 przez którą  */
		  /*  podzieliliśmy x  */

			while (x < 1)
			{
				x=x*4;
				k--;
			}

		  /*  W tym momencie x należy do przedziału [1,4), i k jest zapamiętane.  */
		  /*  Zauważmy, że tylko co najwyżej jedna pętla while mogła być wykonana  */

			y_nowy=2;	/*  Inicjalizujemy stare przybliżenie  */
			do
			{
				y_stary=y_nowy;
				y_nowy=(y_stary+x/y_stary)/2;
			}
			while (fabs(y_stary-y_nowy) >= eps);

		  /*  Pętla będzie przynajmniej raz wykonana. W tym momencie y_nowy reprezentuje pierwiastek  */

			y_nowy=y_nowy*pow(2,k);
			if (minus==0)
				printf("Pierwiastek wynosi %lf.\n\n",y_nowy);
			else
				printf("Pierwiastek jest urojony i wynosi %lf i.\n\n",y_nowy);
		}
		else
			printf("Pierwiastek wynosi oczywiście 0.\n\n");
		printf("Czy chcesz kontynuować? [t/n]\n\n\n");
		scanf("%c",&test);
		while((test!='t')&&(test!='n'))
			scanf("%c",&test);
	}
	return EXIT_SUCCESS;
}