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:
- Metodą bezpośrednią (pętli, korzystamy z funkcji
pow()
). - Metodą bezpośrednią, wyliczając potęgi metodą kolejnych mnożeń1.
- 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 Bryku w Dodatku E.
Wykorzystać trzeba funkcję gettimeofday()
1 |
#include <sys/time.h> |
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
1 2 3 4 |
struct timeval start, stop; unsigned long long Start, Stop; // gettimeofday(&start, NULL); |
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):
1 |
Start = start.tv_sec * 1000000 + start.tv_usec; |
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.