Laboratorium 16: Metoda Hornera obliczania wartości wielomianu


Mamy wielomian w postaci:

Możemy go zapisać w postaci:

Aby wyliczyć wartość wielomianu korzystając z pierwszego wzoru musimy wykonać  dodawań i  mnożeń. Użycie drugiego wzoru pozwala zmniejszyć liczbą mnożeń do ; liczba dodawań pozostaje bez zmian.

Zadanie

Należe napisać trzy funkcje wyliczające wartość wielomianu:

  1. Metodą bezpośrednią (pętli, korzystamy z funkcji pow()).
  2. Metodą bezpośrednią, wyliczając potęgi metodą kolejnych mnożeń1.
  3. Metodą Hornera2.

Metoda Hornera może być zrealizowana w sposób rekurencyjny.

Zadania (funkcje) powinny być dodawane w podanej wyżej kolejności: bezpośrednio z pow(), bezpośrednio z mnożeniem, metodą Hornera, metodą Hornera rekurencyjną. Na koniec można dodać czas obliczeń dla każdego wariantu.

Porównanie czasu obliczeń każdego wariantu

Podstawy opisujące zasady wyliczania czasu obliczeń podane są w BrykuDodatku E.

Wykorzystać trzeba funkcję gettimeofday()

Funkcja korzysta ze zdefiniowanej w pliku nagłówkowym sys/time.h struktury struct timeval. Każda zmienna tego typu ma dwie składowe: pierwsza (tv_sec) zawiera liczbę sekund, która upłynęła od początku Epoki, a druga (tv_usec) liczbę mikrosekund od ostatniej pełnej sekundy.

Najprostsze użycie tej funkcji jest takie

Zmienna (struktura) start zawiera aktualny czas jako liczbę sekund (od początku Epoki) i liczbę mikrosekund od ostatniej pełnej sekundy. Możemy to zamienić na mikrosekundy (sekundy mnożymy przez 1000000, czyli milion):

Podobnie trzeba odczytać czas po zakończeniu obliczeń.

Żeby dostać wiarogodne wyniki należy obliczenia powtórzyć kilka razy. Same wywołanie funkcji również powinno być wykonane kilka-kilkanaście tysięcy razy.

Wersja PDF dokumentu…

…jest również dostępna.


1 Zwracam uwagę, że na każdym etapie można wartość potęgi liczyć zaczynając od początku (wykonując) kolejne mnożenia startując zawsze od początku, albo wykorzystując potęgę wyliczoną na poprzednim etapie.
2 Warto zastanowić się w jakiej kolejności mają być pobierane współczynniki wielomianu: od 0 do  czy raczej odwrotnie?