#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;
}