[C++] Obliczyć przybliżoną wartość funkcji - POMOCY
Ostatnio zmodyfikowano 2017-06-06 15:15
piotrek424 Temat założony przez niniejszego użytkownika |
» 2017-06-06 14:40:02 Chciałem napisać -1 i 3. Na takich wartościach wcześniej testowałem.
|x|<1 więc mam rozumieć że w przypadku wartości bezwzględnej będzie to przedział od -0.999.. do 0.999... ?? Dlaczego napisałeś że tylko od 0 do 0.9? W k się pomyliłem i jest tak jak powiadasz.
|
|
hit |
» 2017-06-06 14:45:07 |x| to jak rozumiem jest wartość bezwzględna z x. Nie uwzględniłeś tego w swoim programie więc zaleciłem wprowadzanie liczb dodatnich. Jeśli chcesz wprowadzać wartości od -0.999 do 0 to wewnątrz programu powinieneś użyć funkcji abs dla x, która zwróci wartość bezwzględną czyli nieuwzględniającą znaku -. Edit: Jednak nie, z absem powinieneś sprawdzać tylko przy wprowadzaniu. Możesz podawać wartości od -0.99 do 0.99 i będzie ok. Edit2: Lub po prostu zmień warunek: while( x >= 1 ) na while( x >= 1 || x <= - 1 ) i już będzie ok. |
|
piotrek424 Temat założony przez niniejszego użytkownika |
» 2017-06-06 14:53:09 Właśnie też na to wpadłem. Tylko dlaczego jak wpisze wartość k np. 99 to w wyniku funkcji pokazuje się: nan ? |
|
hit |
» 2017-06-06 14:55:41 Bo tak jak Ci napisał @darko202, we wzorze jest silnia z k, której wartość rośnie bardzo szybko. Mi do k=50 liczyło bez problemu i z wystarczającą precyzją. https://pl.wikipedia.org/wiki/NaN |
|
piotrek424 Temat założony przez niniejszego użytkownika |
» 2017-06-06 15:08:00 Ok. W takim razie wszystko jasne. Reasumując zrobiłem taki kod. Sprawdź jeśli możesz czy jest ok. I bardzo bardzo dziękuję za szybką pomoc i oczywiście cierpliwość. #include <iostream> #include <cstdlib> #include <cmath> using namespace std; double silnia( double n ) { if( n == 0 ) return 1; else return silnia( n - 1 ) * n; }
int main() { double x; double k; double wynik = 0; double prawa, lewa; cout << "Podaj |x| < 1: "; cin >> x; while( x >= 1 || x <= - 1 ) { cout << "Podaj ponownie prawidlowa wartosc: |x| < 1: "; cin >> x; } cout << "Podaj k >= 0: "; cin >> k; while( k < 0 ) { cout << "Podaj ponownie prawidlowa wartosc: k >= 0: "; cin >> k; } for( int i = 0; i < k; i++ ) { wynik +=( pow( - 1, i ) * silnia( 2 * i ) ) /(( 1 - 2 * i ) * pow( silnia( i ), 2 ) * pow( 4, i ) ) * pow( x, i ); } prawa = wynik; lewa = sqrt( x + 1 ); cout << "Wynik lewej strony wyrazenia:" << lewa << endl; cout << "Wynik funkcji:" << prawa; getchar(); return 0; }
|
|
hit |
» 2017-06-06 15:15:04 Liczy ok, ale bez sensu jest tworzenie zmiennej prawa, bo od razu możesz wyświetlać wynik (lub obliczać wynik do zmiennej prawa). Zmiennej lewa jakby się uprzeć też nie musisz tworzyć: cout << "Wynik lewej strony wyrazenia:" << sqrt( x + 1 ) << endl; cout << "Wynik funkcji:" << wynik;
Ale generalnie jest ok. |
|
1 « 2 » |