Advertisement
Guest User

Vbvg

a guest
Dec 14th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. double horner(double* A, int n, double x)
  9. {
  10. double v = 0;
  11.  
  12. for (int i = n; i >= 0; )
  13. {
  14. v = *(A + i--) + v * x;
  15. }
  16.  
  17. return v;
  18. }
  19.  
  20. double zwykla(double* A, int n, double x)
  21. {
  22. double v = 0;
  23. double potegaX = 1;
  24.  
  25. for (int i = 0; i <= n; potegaX *= x)
  26. {
  27. v = v + *(A + i++) * potegaX;
  28. }
  29.  
  30. return v;
  31. }
  32.  
  33. int main()
  34. {
  35. srand(time(NULL)); // zainicjowanie pracy generatora liczb pseudolosowych
  36. cout.precision(14); // ustawienie wyswietlania precyzji obliczen
  37. const int LICZBA_CYKLI = 15;
  38. const int LICZBA_WYKONAN = 10000;
  39. int przelicznik = (CLOCKS_PER_SEC) * LICZBA_WYKONAN;
  40.  
  41. int n; // zmienna odpowiedzialna za stopien wielomianu
  42.  
  43. cout << "Program porownujacy metody obliczania wartosci wielomianow\n\n";
  44.  
  45. cout << "Prosze wprowadzic stopien wielomianu: ";
  46. cin >> n;
  47.  
  48. cout << "\nWszystkie czasy sa podane w mikrosekundach\n";
  49.  
  50. double* A = new double[n + 1]; // tablica ze wspolczynnikami wielomianu
  51.  
  52. clock_t tPoczatkowe, tKoncowe; // zmienne do pomiaru czasu
  53. double tHorner = 0; // calkowity czas dzialania metody Hornera
  54. double tZwykla = 0; // calkowity czas dzialanie metody zwyklej
  55. double x, y, t, yHorner; // zmienne pomocnicze
  56.  
  57. // przeprowadzanie cykli obliczen
  58. for (int cykl = 1; cykl <= LICZBA_CYKLI; ++cykl)
  59. {
  60. cout << "\nCykl " << cykl << ".\n";
  61.  
  62. // wylosowanie wspolczynnikow wielomianu
  63. for (int i = 0; i <= n; ++i)
  64. {
  65. *(A + i) = ((double) rand() / (RAND_MAX));
  66. }
  67.  
  68. x = ((double) rand() / (RAND_MAX)); // wylosowanie liczby x
  69.  
  70.  
  71. // metoda Hornera
  72. tPoczatkowe = clock(); // poczatkowy czas
  73.  
  74. // kilkukrotne wykonanie funkcji horner dla wylosowanych danych
  75. for (int wykonanie = 0; wykonanie < LICZBA_WYKONAN; ++wykonanie)
  76. {
  77. y = horner(A, n, x);
  78. }
  79.  
  80. tKoncowe = clock(); // koncowy czas
  81. yHorner = y; // zapisanie wyniku metody Hornera
  82.  
  83. // obliczenie roznicy czasu i dodanie jej do calkowitej sumy czasow
  84. t = ((double) (tKoncowe - tPoczatkowe) / przelicznik) * 1e6;
  85. tHorner += t;
  86.  
  87. cout << "\nMetoda Hornera\nObliczona wartosc: " << y;
  88. cout << "\nCzas dzialania: " << t << "\n";
  89.  
  90.  
  91. // metoda zwykla
  92. tPoczatkowe = clock(); // poczatkowy czas
  93.  
  94. // kilkukrotne wykonanie funkcji zwykla dla wylosowanych danych
  95. for (int wykonanie = 0; wykonanie < LICZBA_WYKONAN; ++wykonanie)
  96. {
  97. y = zwykla(A, n, x);
  98. }
  99.  
  100. tKoncowe = clock(); // koncowy czas
  101.  
  102. // obliczenie roznicy czasu i dodanie jej do calkowitej sumy czasow
  103. t = ((double) (tKoncowe - tPoczatkowe) / przelicznik) * 1e6;
  104. tZwykla += t;
  105.  
  106. cout << "\nMetoda zwykla\nObliczona wartosc: " << y;
  107. cout << "\nCzas dzialania: " << t << "\n";
  108. cout << "Roznica pomiedzy wynikami: " << fabs(yHorner - y) << "\n";
  109. }
  110.  
  111. cout << "\nSrednie czasy dzialania";
  112. cout << "\nMetoda Hornera: " << (tHorner / LICZBA_CYKLI);
  113. cout << "\nMetoda zwykla: " << (tZwykla / LICZBA_CYKLI);
  114.  
  115. delete[] A; // usuniecie tablicy A
  116.  
  117. return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement