Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #define _USE_MATH_DEFINES
- #include <cmath>
- #include <stack>
- #define M_PI_2 1.57079632679489661923
- using namespace std;
- ofstream wyjscied;
- int sgn(long double x)
- {
- if(x>0)
- return 1;
- else
- return -1;
- }
- void licz_double(long double x, long double epsilon)
- {
- long double suma = x;
- stack<long double> stos_sum;
- if(x <= 1 && x >= (-1))
- {
- suma = x;
- stos_sum.push(suma);
- long double potega = x;
- long double nastepny = 1000.0;
- bool p=0;
- for(int n = 1; nastepny > epsilon; n+=1)
- {
- potega = potega * x * x;
- if(p==1)
- {
- suma = suma + (potega/(2*n + 1.0));
- stos_sum.push(potega/(2*n + 1.0));
- }
- else
- {
- suma = suma - (potega/(2*n + 1.0));
- stos_sum.push(-potega/(2*n + 1.0));
- }
- p = !p;
- nastepny = abs((potega*x*x)/(2*(n+1) + 1.0));
- }
- }
- else
- {
- suma = (sgn(x) * M_PI_2) - (1/x);
- long double potega = x;
- bool p = 1;
- stos_sum.push(suma);
- long double nastepny = 1000.0;
- for(int n =1; nastepny >= epsilon; n+=1)
- {
- potega = potega * x *x;
- if(p==1)
- {
- suma = suma + 1/((2*n + 1)*potega);
- stos_sum.push(1/((2*n + 1)*potega));
- }
- else
- {
- suma = suma - 1/((2*n + 1)*potega);
- stos_sum.push(-1/((2*n + 1)*potega));
- }
- p = !p;
- nastepny = abs(1/((2*n + 3)*(potega*x*x)));
- }
- }
- long double arctan = atan(x);
- long double wynik =0.0;
- int size = stos_sum.size();
- for(int i=0; i <size; i++)
- {
- wynik = wynik + stos_sum.top();
- stos_sum.pop();
- }
- //cout << "kolejnosc dodawania od najmniejszych do najwiekszych\n";
- //cout << "argument:\t"<< x << "\n";
- //cout << "wynik obliczen:\t"<< wynik << "\n";
- //cout << "wynik atan stl:\t"<< arctan << "\n";
- //cout << "blad wzgledny:\t" << (wynik-arctan)/arctan << "\n";
- //cout << "blad bezwzgledny:\t" << wynik-arctan <<"\n\n";
- //cout << "kolejnosc dodawania od najwiekszych do najmniejszych\n";
- //cout << x << "\t" << suma << "\t" << arctan << "\t" << (suma-arctan)/arctan << "\t" << suma-arctan << "\n\n";
- //cout << epsilon << " " << size << "\n";
- //cout << size << "\n";
- //wyjscied << x << "\t" << wynik << "\n";
- cout << x << "\n";
- wyjscied << x << "\t" << (wynik-arctan)/arctan << "\n";
- }
- void licz_float(float x, long double epsilon)
- {
- float suma = x;
- stack<float> stos_sum;
- if(x <= 1 && x >= (-1))
- {
- suma = x;
- float potega = x;
- bool p = 0;
- float nastepny = 1000.0;
- stos_sum.push(suma);
- for(int n = 1; nastepny >= epsilon; n+=1)
- {
- potega = potega * x * x;
- if(p==1)
- {
- suma = suma + (potega/(2*n + 1.0));
- stos_sum.push(potega/(2*n + 1.0));
- }
- else
- {
- suma = suma - (potega/(2*n + 1.0));
- stos_sum.push(-potega/(2*n + 1.0));
- }
- p = !p;
- nastepny = ((potega*x*x)/(2*(n+1) + 1.0));
- }
- }
- else
- {
- suma = (sgn(x) * M_PI_2) - (1/x);
- float potega = x;
- bool p = 1;
- stos_sum.push(suma);
- float nastepny = 1000.0;
- for(int n =1; nastepny >= epsilon; n+=1)
- {
- potega = potega * x *x;
- if(p==1)
- {
- suma = suma + 1/((2*n + 1)*potega);
- stos_sum.push(1/((2*n + 1)*potega));
- }
- else
- {
- suma = suma - 1/((2*n + 1)*potega);
- stos_sum.push(-1/((2*n + 1)*potega));
- }
- p = !p;
- }
- }
- long double arctan = atan(x);
- float wynik =0.0;
- int size = stos_sum.size();
- for(int i=0; i <size; i++)
- {
- wynik = wynik + stos_sum.top();
- stos_sum.pop();
- }
- cout << "kolejnosc dodawania od najmniejszych do najwiekszych\n";
- cout << "argument:\t"<< x << "\n";
- cout << "wynik obliczen:\t"<< wynik << "\n";
- cout << "wynik atan stl:\t"<< arctan << "\n";
- cout << "blad wzgledny:\t" << (wynik-arctan)/arctan << "\n";
- cout << "blad bezwzgledny:\t" << wynik-arctan <<"\n\n";
- cout << "kolejnosc dodawania od najwiekszych do najmniejszych\n";
- cout << x << "\t" << suma << "\t" << arctan << "\t" << (suma-arctan)/arctan << "\t" << suma-arctan << "\n\n";
- }
- int main()
- {
- //cout << fixed;
- long double x=0;
- long double epsilon=0;
- cout.precision(30);
- wyjscied << fixed;
- wyjscied.open("outd.txt");
- wyjscied.precision(26);
- if(!wyjscied.good())
- {
- printf("blad pliku wyjsciowego");
- return 12;
- }
- //cout << "arctg z zadana dokladnoscia\n";
- //cout << "podaj argument funkcji\n";
- //cin >> x;
- x = -0.999;
- epsilon=1e-10;
- //cout << "podaj zadana dokladnosc\n";
- //cin >> epsilon;
- for(int i=1; i<2000; i++)
- {
- x=(i*0.001)-1;
- licz_double(x, epsilon);
- }
- //licz_float((float)x,epsilon);
- wyjscied.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement