// vlastni implementace funkce sinus, overeni presnosti
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;

double faktorial(int n){
  double f = 1;
  int i;
  for(i = 2; i <= n; i++)
    f *= i;
  return(f);
}

double mocnina(double x, int a){
  double moc = 1;
  int i;
  for(i = 1; i <= a; i++)
    moc *= x;
  return(moc);
}


double mujsin(double x, int clenu){
  double suma;
  int i, n, znamenko;
  suma = 0; znamenko = 1;
  for(i = 1;i <= clenu; i++){
    n = 2*i - 1;
    suma += znamenko*mocnina(x,n)/faktorial(n);
    znamenko *= -1;          // znamenko v rade alternuje
  }
  return(suma);
}

int main(void){
  double x, dx, s1, s2, ds;
  int clenu;
  x=M_PI/4.;
  // nejdrive zjistime jak presnost vypoctu zavisi na poctu clenu
  // toto provedeme pro uhel pi/4
  cout << "clenu    mujsin         sin         rozdil\n";
  cout << "--------------------------------------------\n";
  for(clenu = 1; clenu <= 5; clenu++){
    s1 = mujsin(x,clenu);
    s2 = sin(x);
    ds = s1 - s2;
    cout << setw(3) << clenu << fixed << setprecision(8) << setw(14) << s1;
    cout << setw(13) << s2 << setw(14) << ds << endl;
  }
  // nyni overime zda je presnost stejna pro vsechny uhly
  clenu = 3;
  dx = M_PI/2./10.;          // krok v uhlu
  cout << endl << endl;      // odradkuje
  cout << "   x       mujsin         sin        rozdil\n";
  cout << "---------------------------------------------\n";
  for(x = 0;x <= M_PI/2.;x += dx){
    s1 = mujsin(x,clenu);
    s2 = sin(x);
    ds = s1 - s2;
    cout << setprecision(4) << x << setprecision(8) << setw(13) << s1;
    cout << setw(13) << s2 << setw(13) << ds << endl;   
  }
}
