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