Advertisement
Guest User

Untitled

a guest
Nov 29th, 2015
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.29 KB | None | 0 0
  1. //Projekt c.2
  2. //Vytvoril: Lukas Novak
  3. //Login: xnovak1t
  4. //1.rocnik BIT
  5. //Akademicky rok 2015/2016
  6. //Skupina c.32
  7.  
  8. //include soubory
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <math.h> //vyuzivam pro logaritmus a konstanty NAN a INFINITY
  12.  
  13. //Funkce projektu
  14.  
  15. //Funkce taylor_log pro vypocet prirozeneho logaritmu pomoci taylorova polynomu
  16. double taylor_log(double x, unsigned int n);
  17.  
  18. //Funkce cfrac_log pro vypocet prirozeneho logaritmu pomoci zretezeneho zlomku
  19. double cfrac_log(double x, unsigned int n);
  20.  
  21. //Funkce pro vypsani logaritmu po zadani "--log"
  22. void vypis_logaritmu(double x, unsigned int n);
  23.  
  24. //Funkce cfrac_iter, ktera pocita pocet iteraci pomoci zretezeneho zlomku
  25. int cfrac_iter(double max, double min, double eps);
  26.  
  27. //Funkce taylor_iter, která pocita pocet iteraci pomoci taylorova polynomu
  28. int taylor_iter(double max, double min, double eps);
  29.  
  30. //Funkce pro vypsani logaritmu po zadani "--iter"
  31. void vypis_iterace(double min,double max,double eps);
  32.  
  33.  
  34. //Hlavni program projektu
  35. int main(int argc,char *argv[]) //Vstupem jsou argumenty
  36. {
  37.  char *Err;
  38.  if((argc < 4) && (argc > 5)) //zjistovani pocet argumentu, pokud je mene ja 4 nebo vice jak 5 ukonci se program
  39.  {
  40.    printf("Nebyl zadan spravny vstup" );
  41.    return 1;
  42.  }
  43.  
  44.  if(argc == 4) // Pokud jsou 4 argumenty, pokracuje se
  45.  {
  46.    if(!(strcmp(argv[1],"--log"))) //porovnava prvni argument s retezcem "--log"
  47.    {
  48.      double x = strtod(argv[2],&Err);
  49.      if(Err == argv[2])
  50.      {
  51.        printf("na vstupu neni cislo ");
  52.        return 1;
  53.      }
  54.      unsigned int pocet_clenu = strtol(argv[3], &Err, 10);
  55.      if(Err == argv[3])
  56.      {
  57.        printf("na vstupu neni cislo ");
  58.        return 1;
  59.      }
  60.      vypis_logaritmu(x,pocet_clenu); // Zde se vypise logaritmus
  61.    }
  62.  }
  63.  
  64.  if(argc == 5) //Pokud je argumentu 5, pokracuje
  65.  {
  66.    if(!(strcmp(argv[1],"--iter"))) // porovnava prvni argument s retezcem "--iter"
  67.    {
  68.      double min= strtod(argv[2],&Err);
  69.      if(Err == argv[2])
  70.      {
  71.        printf("na vstupu neni cislo");
  72.        return 1;
  73.      }
  74.      double max= strtod(argv[3],&Err);
  75.      if(Err == argv[3])
  76.      {
  77.        printf("na vstupu neni cislo");
  78.        return 1;
  79.      }
  80.      double eps= strtod(argv[4],&Err);
  81.      if(Err == argv[4])
  82.      {
  83.        printf("na vstupu neni cislo");
  84.        return 1;
  85.      }
  86.     vypis_iterace(min,max,eps); // Zde se vypise pocet iteraci
  87.    }
  88.  }
  89.  return 0;
  90. }
  91.  
  92.  
  93.  
  94. //Funkce pro vypsani logaritmu po zadani "--log"
  95. void vypis_logaritmu(double x, unsigned int n)
  96. {
  97.  printf("       log(%.4g)= %.12g\n", x, log(x));
  98.  printf("    cf_log(%.4g)= %.12g\n", x, cfrac_log(x, n));
  99.  printf("taylor_log(%.4g)= %.12g\n", x, taylor_log(x, n));
  100.  
  101. }
  102.  
  103. //Funkce pro vypsani logaritmu po zadani "--iter"
  104. void vypis_iterace(double min, double max, double eps)
  105. {
  106.  printf("       log(%4g) = %.12g\n",min, log(min));
  107.  printf("       log(%4g) = %.12g\n",max, log(max));
  108.  int n= cfrac_iter(min, max, eps);
  109.  printf("continued fraction iterations = %d\n",cfrac_iter(min, max, eps));
  110.  printf("    cf_log(%4g) = %.12g\n",min, cfrac_log(min, n));
  111.  printf("    cf_log(%4g) = %.12g\n",max, cfrac_log(max, n));
  112.  n=taylor_iter(min,max,eps);
  113.  printf("taylor polynomial iterations = %d\n",taylor_iter(min ,max, eps));
  114.  printf("taylor_log(%4g) = %.12g\n",min, taylor_log(min, n));
  115.  printf("taylor_log(%4g) = %.12g\n",max, taylor_log(max, n));
  116. }
  117.  
  118. //Funkce taylor_log pro vypocet prirozeneho logaritmu pomoci taylorova polynomu
  119. double taylor_log(double x, unsigned int n)
  120. {
  121.  long long i=1;
  122.  double t=1.0;
  123.  double taylor=0.0;
  124.  if(x == 0) //pokud log(0) = -infinity
  125.     return -INFINITY;
  126.  if(x < 0) // pokud log(x<0) = NAN
  127.     return NAN;
  128.  
  129.  if(x>0 && x<=1) // pro log(x>0) a zaroven (x<=1)
  130.  {
  131.    while(i<n) // dokud promena i nebude vetsi jak n
  132.    {
  133.      t*=(1.0-x);
  134.      t/=i;
  135.      taylor-=t;
  136.      t*=i;
  137.      i++;
  138.    }
  139.  }
  140.  
  141.  if(x > 1) //pro log(x>1)
  142.  {
  143.    while(i<n) // dokud promena i nebude vetsi jak n
  144.    {
  145.      t=(t*(x-1)/x)/i;
  146.      taylor+=t;
  147.      t*=i;
  148.      i++;
  149.    }
  150.   }
  151.   return taylor;
  152. }
  153.  
  154. //Funkce cfrac_iter, ktera pocita pocet iteraci pomoci zretezeneho zlomku
  155. double cfrac_log(double x, unsigned int n)
  156. {
  157.  double zlomek = 0;
  158.  double celeCislo = 0.0;
  159.  double vysledek = 0.0;
  160.  unsigned int i;
  161.  double citatel = 0.0;
  162.  
  163.  if(x == 0) //pokud log(0) = -infinity
  164.     return -INFINITY;
  165.  if(x < 0) // pokud log(x<0) = NAN
  166.     return NAN;
  167.  
  168.  x=(1-x)/(1+x);
  169.  
  170.  for (i = n; i >= 1; i--) // Cyklus for dekrementuje promenou i a skonci kdyz i se bude rovnat 1
  171.  {
  172.   citatel=(i*x)*(i*x);
  173.   celeCislo=(i + 1)*2-1;
  174.   zlomek = citatel / (celeCislo - zlomek);
  175.  }
  176.  vysledek= 2*x/(1.0-zlomek);
  177.  return -vysledek;
  178. }
  179.  
  180. //Funkce cfrac_iter, ktera pocita pocet iteraci pomoci zretezeneho zlomku
  181. int cfrac_iter(double max, double min, double eps)
  182. {
  183.  unsigned int n=1;
  184.  while ((fabs(cfrac_log(max,n) - log(max))) > (eps))
  185.     n++;
  186.  
  187.  unsigned int m=1;
  188.  while ((fabs(cfrac_log(min,m) - log(min))) > (eps))
  189.     m++;
  190.  if(m>n)
  191.    n=m;
  192.  return n;
  193. }
  194.  
  195. //Funkce taylor_iter, která pocita pocet iteraci pomoci taylorova polynomu
  196. int taylor_iter(double max, double min, double eps)
  197. {
  198.  unsigned int n=1;
  199.  while(fabs(taylor_log(max,n)-log(max)) > (eps))
  200.     n++;
  201.  
  202.  unsigned int m=1;
  203.  while(fabs(taylor_log(min,m)-log(min)) > (eps))
  204.     m++;
  205.  
  206.  if(m>n)
  207.    n = m;
  208.  return n;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement