Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Projekt c.2
- //Vytvoril: Lukas Novak
- //Login: xnovak1t
- //1.rocnik BIT
- //Akademicky rok 2015/2016
- //Skupina c.32
- //include soubory
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h> //vyuzivam pro logaritmus a konstanty NAN a INFINITY
- //Funkce projektu
- //Funkce taylor_log pro vypocet prirozeneho logaritmu pomoci taylorova polynomu
- double taylor_log(double x, unsigned int n);
- //Funkce cfrac_log pro vypocet prirozeneho logaritmu pomoci zretezeneho zlomku
- double cfrac_log(double x, unsigned int n);
- //Funkce pro vypsani logaritmu po zadani "--log"
- void vypis_logaritmu(double x, unsigned int n);
- //Funkce cfrac_iter, ktera pocita pocet iteraci pomoci zretezeneho zlomku
- int cfrac_iter(double max, double min, double eps);
- //Funkce taylor_iter, která pocita pocet iteraci pomoci taylorova polynomu
- int taylor_iter(double max, double min, double eps);
- //Funkce pro vypsani logaritmu po zadani "--iter"
- void vypis_iterace(double min,double max,double eps);
- //Hlavni program projektu
- int main(int argc,char *argv[]) //Vstupem jsou argumenty
- {
- char *Err;
- if((argc < 4) && (argc > 5)) //zjistovani pocet argumentu, pokud je mene ja 4 nebo vice jak 5 ukonci se program
- {
- printf("Nebyl zadan spravny vstup" );
- return 1;
- }
- if(argc == 4) // Pokud jsou 4 argumenty, pokracuje se
- {
- if(!(strcmp(argv[1],"--log"))) //porovnava prvni argument s retezcem "--log"
- {
- double x = strtod(argv[2],&Err);
- if(Err == argv[2])
- {
- printf("na vstupu neni cislo ");
- return 1;
- }
- unsigned int pocet_clenu = strtol(argv[3], &Err, 10);
- if(Err == argv[3])
- {
- printf("na vstupu neni cislo ");
- return 1;
- }
- vypis_logaritmu(x,pocet_clenu); // Zde se vypise logaritmus
- }
- }
- if(argc == 5) //Pokud je argumentu 5, pokracuje
- {
- if(!(strcmp(argv[1],"--iter"))) // porovnava prvni argument s retezcem "--iter"
- {
- double min= strtod(argv[2],&Err);
- if(Err == argv[2])
- {
- printf("na vstupu neni cislo");
- return 1;
- }
- double max= strtod(argv[3],&Err);
- if(Err == argv[3])
- {
- printf("na vstupu neni cislo");
- return 1;
- }
- double eps= strtod(argv[4],&Err);
- if(Err == argv[4])
- {
- printf("na vstupu neni cislo");
- return 1;
- }
- vypis_iterace(min,max,eps); // Zde se vypise pocet iteraci
- }
- }
- return 0;
- }
- //Funkce pro vypsani logaritmu po zadani "--log"
- void vypis_logaritmu(double x, unsigned int n)
- {
- printf(" log(%.4g)= %.12g\n", x, log(x));
- printf(" cf_log(%.4g)= %.12g\n", x, cfrac_log(x, n));
- printf("taylor_log(%.4g)= %.12g\n", x, taylor_log(x, n));
- }
- //Funkce pro vypsani logaritmu po zadani "--iter"
- void vypis_iterace(double min, double max, double eps)
- {
- printf(" log(%4g) = %.12g\n",min, log(min));
- printf(" log(%4g) = %.12g\n",max, log(max));
- int n= cfrac_iter(min, max, eps);
- printf("continued fraction iterations = %d\n",cfrac_iter(min, max, eps));
- printf(" cf_log(%4g) = %.12g\n",min, cfrac_log(min, n));
- printf(" cf_log(%4g) = %.12g\n",max, cfrac_log(max, n));
- n=taylor_iter(min,max,eps);
- printf("taylor polynomial iterations = %d\n",taylor_iter(min ,max, eps));
- printf("taylor_log(%4g) = %.12g\n",min, taylor_log(min, n));
- printf("taylor_log(%4g) = %.12g\n",max, taylor_log(max, n));
- }
- //Funkce taylor_log pro vypocet prirozeneho logaritmu pomoci taylorova polynomu
- double taylor_log(double x, unsigned int n)
- {
- long long i=1;
- double t=1.0;
- double taylor=0.0;
- if(x == 0) //pokud log(0) = -infinity
- return -INFINITY;
- if(x < 0) // pokud log(x<0) = NAN
- return NAN;
- if(x>0 && x<=1) // pro log(x>0) a zaroven (x<=1)
- {
- while(i<n) // dokud promena i nebude vetsi jak n
- {
- t*=(1.0-x);
- t/=i;
- taylor-=t;
- t*=i;
- i++;
- }
- }
- if(x > 1) //pro log(x>1)
- {
- while(i<n) // dokud promena i nebude vetsi jak n
- {
- t=(t*(x-1)/x)/i;
- taylor+=t;
- t*=i;
- i++;
- }
- }
- return taylor;
- }
- //Funkce cfrac_iter, ktera pocita pocet iteraci pomoci zretezeneho zlomku
- double cfrac_log(double x, unsigned int n)
- {
- double zlomek = 0;
- double celeCislo = 0.0;
- double vysledek = 0.0;
- unsigned int i;
- double citatel = 0.0;
- if(x == 0) //pokud log(0) = -infinity
- return -INFINITY;
- if(x < 0) // pokud log(x<0) = NAN
- return NAN;
- x=(1-x)/(1+x);
- for (i = n; i >= 1; i--) // Cyklus for dekrementuje promenou i a skonci kdyz i se bude rovnat 1
- {
- citatel=(i*x)*(i*x);
- celeCislo=(i + 1)*2-1;
- zlomek = citatel / (celeCislo - zlomek);
- }
- vysledek= 2*x/(1.0-zlomek);
- return -vysledek;
- }
- //Funkce cfrac_iter, ktera pocita pocet iteraci pomoci zretezeneho zlomku
- int cfrac_iter(double max, double min, double eps)
- {
- unsigned int n=1;
- while ((fabs(cfrac_log(max,n) - log(max))) > (eps))
- n++;
- unsigned int m=1;
- while ((fabs(cfrac_log(min,m) - log(min))) > (eps))
- m++;
- if(m>n)
- n=m;
- return n;
- }
- //Funkce taylor_iter, která pocita pocet iteraci pomoci taylorova polynomu
- int taylor_iter(double max, double min, double eps)
- {
- unsigned int n=1;
- while(fabs(taylor_log(max,n)-log(max)) > (eps))
- n++;
- unsigned int m=1;
- while(fabs(taylor_log(min,m)-log(min)) > (eps))
- m++;
- if(m>n)
- n = m;
- return n;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement