Wielomian
Jak wiadomo, wielomian (stopnia
Wyliczanie wartości wielomianu
W naturalny sposób, kod (C) wyliczający jego wartość wyglądać może tak:
double wielomian (int N, double *a, double x)
{
double w = 0.;
int i;
for (i = 0; i < N; i++)
w += pow (x, i) * a[i];
return w;
}
Sprytny student zauważy, że kod ten można „zoptymalizować" w sposób następujący:
double wielomian (int N, double *a, double x)
{
double w = a[0];
int i;
for (i = 1; i < N; i++)
w += pow (x, i) * a[i];
return w;
}
oszczędzając jeden obieg pętli (i jedno wywołanie funkcji pow
). Czy
możliwe są dalsze optymalizacje? Oczywiście, można zrezygnować z funkcji
pow
:
double wielomian (int N, double *a, double x)
{
double w = 0.;
int i;
double pow = 1;
for (i = 0; i < N; i++)
{
w += pow * a[i];
pow *= x;
}
return w;
}
(Prawdę mówiąc warto rezygnować z funkcji pow
, gdyż jest to armata
wystawiona na wróbelka: podnosimy
Czy są możliwe dalsze optymalizacje? Czy może to mieć wpływ na dokładność obliczeń? Czy jakąś własność numeryczną algorytmu?
„Tradycyjna" metoda obliczeń wymaga
Metoda Hornera
Zapisując wielomian nieco inaczej:
Co więcej algorytm Hornera jest numerycznie poprawny.
Algorytm Hornera może być również przydatny podczas dzielenia wielomianu