Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <cmath>
  5. #include <chrono>
  6.  
  7. using namespace std;
  8.  
  9. double horner(double* p, double x, int n) {
  10. double y = 0;
  11.  
  12. for (int i = 0; i < n; ++i)
  13. y = x * y + p[i];
  14.  
  15. return y;
  16. }
  17.  
  18. double simple(double* p, double x, int n) {
  19. double y = 0;
  20. double xi = 1;
  21.  
  22. for (int i = n - 1; i >= 0; --i, xi *= x)
  23. y += p[i] * xi;
  24.  
  25. return y;
  26. }
  27.  
  28. void print_poly(double* p, int n) {
  29. for (int i = 0; i < n; ++i) {
  30. cout << " + (" << p[i] << ") x^" << (n - i - 1);
  31. }
  32. }
  33.  
  34. void rand_poly(double* p, int n) {
  35. for (int i = 0; i < n; ++i) {
  36. p[i] = ((double) rand() / (RAND_MAX));
  37. }
  38. }
  39.  
  40. int main() {
  41. cout.precision(15);
  42. const int NUMBER_OF_EXPERIMENTS = 20;
  43. const int NUMBER_OF_REPETITIONS = 1000000;
  44.  
  45. srand(time(NULL));
  46.  
  47. cout << "---------------------------------------------------\n";
  48. cout << "| WARTOSC WIELOMIANU W PUNKCIE - POROWNANIE |\n";
  49. cout << "---------------------------------------------------\n\n";
  50.  
  51. int n;
  52. double x;
  53.  
  54. cout << "Prosze podac rozmiar tablicy: ";
  55. cin >> n;
  56.  
  57. double* p = new double[n]; // dynamiczna alokacja tablicy
  58.  
  59. std::chrono::steady_clock::time_point start, stop;
  60. double mean_horner_time = 0;
  61. double mean_simple_time = 0;
  62. double y_horner, y_simple, time_horner, time_simple;
  63.  
  64. for (int experiment = 1; experiment <= NUMBER_OF_EXPERIMENTS; ++experiment) {
  65. cout << "Cykl " << experiment << ".\n\n";
  66. rand_poly(p, n);
  67. cout << "p(x) =";
  68. print_poly(p, n);
  69. x = ((double) rand() / (RAND_MAX));
  70. cout << "\nx = " << x << "\n";
  71.  
  72. start = std::chrono::steady_clock::now();
  73. for (int j = 0; j < NUMBER_OF_REPETITIONS; ++j)
  74. y_horner = horner(p, x, n);
  75. stop = std::chrono::steady_clock::now();
  76. time_horner = (double) std::chrono::duration_cast<std::chrono::nanoseconds> (stop - start).count() / NUMBER_OF_REPETITIONS;
  77. mean_horner_time += time_horner;
  78. cout << "\nMetoda Hornera\np(x) = " << y_horner <<
  79. "\nczas = " << time_horner << "\n";
  80.  
  81. start = std::chrono::steady_clock::now();
  82. for (int j = 0; j < NUMBER_OF_REPETITIONS; ++j)
  83. y_simple = simple(p, x, n);
  84. stop = std::chrono::steady_clock::now();
  85. time_simple = (double) std::chrono::duration_cast<std::chrono::nanoseconds> (stop - start).count() / NUMBER_OF_REPETITIONS;
  86. mean_simple_time += time_simple;
  87. cout << "\nMetoda zwykla\np(x) = " << y_simple <<
  88. "\nczas = " << time_simple << "\n";
  89.  
  90. cout << "\nRoznica pomiedzy wynikami: " << fabs(y_horner - y_simple) << "\n\n";
  91. }
  92.  
  93. mean_horner_time /= NUMBER_OF_EXPERIMENTS;
  94. mean_simple_time /= NUMBER_OF_EXPERIMENTS;
  95.  
  96. cout << "Podsumowanie\n";
  97. cout << "Sredni czas metody Hornera: " << mean_horner_time;
  98. cout << "\nSredni czas metody zwyklej: " << mean_simple_time;
  99.  
  100. delete[] p; // usuniecie tablicy
  101.  
  102. return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement