Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <ctime>
- #include <cmath>
- using namespace std;
- double horner(double* A, int n, double x)
- {
- double v = 0;
- for (int i = n; i >= 0; )
- {
- v = *(A + i--) + v * x;
- }
- return v;
- }
- double zwykla(double* A, int n, double x)
- {
- double v = 0;
- double potegaX = 1;
- for (int i = 0; i <= n; potegaX *= x)
- {
- v = v + *(A + i++) * potegaX;
- }
- return v;
- }
- int main()
- {
- srand(time(NULL)); // zainicjowanie pracy generatora liczb pseudolosowych
- cout.precision(14); // ustawienie wyswietlania precyzji obliczen
- const int LICZBA_CYKLI = 15;
- const int LICZBA_WYKONAN = 10000;
- int przelicznik = (CLOCKS_PER_SEC) * LICZBA_WYKONAN;
- int n; // zmienna odpowiedzialna za stopien wielomianu
- cout << "Program porownujacy metody obliczania wartosci wielomianow\n\n";
- cout << "Prosze wprowadzic stopien wielomianu: ";
- cin >> n;
- cout << "\nWszystkie czasy sa podane w mikrosekundach\n";
- double* A = new double[n + 1]; // tablica ze wspolczynnikami wielomianu
- clock_t tPoczatkowe, tKoncowe; // zmienne do pomiaru czasu
- double tHorner = 0; // calkowity czas dzialania metody Hornera
- double tZwykla = 0; // calkowity czas dzialanie metody zwyklej
- double x, y, t, yHorner; // zmienne pomocnicze
- // przeprowadzanie cykli obliczen
- for (int cykl = 1; cykl <= LICZBA_CYKLI; ++cykl)
- {
- cout << "\nCykl " << cykl << ".\n";
- // wylosowanie wspolczynnikow wielomianu
- for (int i = 0; i <= n; ++i)
- {
- *(A + i) = ((double) rand() / (RAND_MAX));
- }
- x = ((double) rand() / (RAND_MAX)); // wylosowanie liczby x
- // metoda Hornera
- tPoczatkowe = clock(); // poczatkowy czas
- // kilkukrotne wykonanie funkcji horner dla wylosowanych danych
- for (int wykonanie = 0; wykonanie < LICZBA_WYKONAN; ++wykonanie)
- {
- y = horner(A, n, x);
- }
- tKoncowe = clock(); // koncowy czas
- yHorner = y; // zapisanie wyniku metody Hornera
- // obliczenie roznicy czasu i dodanie jej do calkowitej sumy czasow
- t = ((double) (tKoncowe - tPoczatkowe) / przelicznik) * 1e6;
- tHorner += t;
- cout << "\nMetoda Hornera\nObliczona wartosc: " << y;
- cout << "\nCzas dzialania: " << t << "\n";
- // metoda zwykla
- tPoczatkowe = clock(); // poczatkowy czas
- // kilkukrotne wykonanie funkcji zwykla dla wylosowanych danych
- for (int wykonanie = 0; wykonanie < LICZBA_WYKONAN; ++wykonanie)
- {
- y = zwykla(A, n, x);
- }
- tKoncowe = clock(); // koncowy czas
- // obliczenie roznicy czasu i dodanie jej do calkowitej sumy czasow
- t = ((double) (tKoncowe - tPoczatkowe) / przelicznik) * 1e6;
- tZwykla += t;
- cout << "\nMetoda zwykla\nObliczona wartosc: " << y;
- cout << "\nCzas dzialania: " << t << "\n";
- cout << "Roznica pomiedzy wynikami: " << fabs(yHorner - y) << "\n";
- }
- cout << "\nSrednie czasy dzialania";
- cout << "\nMetoda Hornera: " << (tHorner / LICZBA_CYKLI);
- cout << "\nMetoda zwykla: " << (tZwykla / LICZBA_CYKLI);
- delete[] A; // usuniecie tablicy A
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement