Obliczanie wielomianu w punkcie

0

Witam, mam problem, którego nie potrafię rozwiązać. Mam stworzyć który pokaże różnicę w obliczeniach między sposobem "na piechotę" rozwiązania wielomianu, a schematem hornera. Wydaje mi się, że program zaokrągla te liczby, choć możliwe, że cała koncepcja jest nie taka jaka powinna być. Bardzo proszę o pomoc.

Mój kod:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;


 double horner(double tab[],int st, int x)
{
	 double wynik = tab[0];

	for(int i=1;i<=st;i++)
		wynik = wynik*x + tab[i];

	return wynik;
}

 double horner_3(double tab[], int st, double x){
     double wynik;
    double p = 1;
    for(int i = 0;i<=st;i++){
        for(int k = 0;k<st-i;k++){
            p = p*x;
        }
        wynik = wynik + tab[i]*p;
        p = 1;
    }

    return wynik;

}


int main()
{
    srand( time( NULL ) );

    cout<<"Podaj wielkosc wielomianu: "<<endl;
    double x;
    int n;
    cin >> n;
    double* a=new double[n+1];
    for(int i = 0; i<n+1;i++){
        a[i] = (double)rand()/(RAND_MAX+1);
      //a[i] = (rand()%2)+1;
    }

    cout<<"Podaj wartosc x: "<<endl;
    cin>>x;
    for(int i = 0; i<n+1;i++){
        cout<<a[i]<<endl;
    }
    cout<<"\nWyniki: "<<endl;
    cout.precision( 30 );
    cout << horner(a,n,x) << endl;
    cout << horner_3(a,n,x) << endl;
    return 0;
}
0

Która funkcja liczy "na piechotę", a która z Hornera i dlaczego raz jest int x, a raz double x?

0
lion137 napisał(a):

Która funkcja liczy "na piechotę", a która z Hornera i dlaczego raz jest int x, a raz double x?

Wkradł się błąd. Powinno być dwa razy double.

Metoda na piechotę to horner_3

0

Jakie są różnice, i w jaki sposób pierwsza funkcja to Horner? Ja tu widze co innego na wiki: https://en.wikipedia.org/wiki/Horner's_method

0
lion137 napisał(a):

Jakie są różnice, i w jaki sposób pierwsza funkcja to Horner? Ja tu widze co innego na wiki: https://en.wikipedia.org/wiki/Horner's_method

No problem jest taki, że różnica zawsze wynosi 0.

Algorytm hornera wziąłem stąd:
http://www.algorytm.edu.pl/algorytmy-maturalne/schemat-hornera.html
( na dole strony jest to rozwiązanie )

0

Może różnica ma być w wydajności? Spróbuj też utworzyć duże duże wielomiany i sprawdzać.

0

W wydajności będzie na pewno, ale w obliczeniach też powinna być właśnie przy większych wielomianach. Napisałem właśnie ten kod w c#(visual studio) i te różnice są widoczne. Więc coś nie tak jest w kodzie c++ najwidocznej.

0

screenshot-20191110234920.png

U mnie działa.Zmieniłem tylko: cout.precision(50);

0
Botek napisał(a):

screenshot-20191110234920.png

U mnie działa.Zmieniłem tylko: cout.precision(50);

hmmm.. no to może to wina kompilatora

0

Chodzi o niedoskonałość liczb zmiennoprzecinkowych.
matematycznie jest to samo, ale kolejność działań inna i wynik trochę się różni.

1

Metoda na piechotę to nie metoda Hornera, dlaczego tak została nazwana?

1 użytkowników online, w tym zalogowanych: 0, gości: 1