Atexor |
» 2014-11-04 01:25:20 Ciężko mi tu dostrzec wzór Maclaurina, chyba że "i" nie oznacza liczby zespolonej, ale konkretną liczbę (głupie oznaczenie). W sumie chyba zgadzałoby się z tym na wiki (na samej dole strony): http://pl.wikipedia.org/wiki/Logarytm_naturalny Ja bym do tego zadania podszedł tak jak poniżej zrobiłem. Dla sprawdzenia, czy w ogóle działa, skompilowałem to i jak się okazało to nie chce poprawnie sumować kolejnych liczb (w kółko oscyluje wokół tych samych). Znając mnie to pewnie coś przeoczyłem, tym bardziej że jest dość późno. Mam nadzieję, że mimo wszystko naświetlę Ci sposób rozwiązania zadania i będziesz w stanie wykryć błąd u mnie/u siebie zrobić. Pozdrawiam #include <iostream> #include <math.h> #include <windows.h> #include <iomanip> using namespace std;
int main() { double epsylon, x, temp = 0, suma = 0.0, n = 1.0; cout << "Podaj x z zakresu (-1,1]." << endl; cin >> x; cout << "Podaj przyblizenie epsylon" << endl; cin >> epsylon; while( 1 ) { suma +=(( pow( - 1, n + 1 ) ) / n ) * pow( x, n ); temp = suma; n++; cout << "Dla przyblizenia eps=" << epsylon << " ln(1+x)=" << setprecision( 15 ) << suma << endl; Sleep( 100 ); } system( "PAUSE" ); return 0; }
|
|
Nedvid Temat założony przez niniejszego użytkownika |
» 2014-11-04 16:07:52 Jest mały błąd w obliczeniach, a mianowicie: NIE: suma +=(( pow( - 1, n + 1 ) ) / n ) * pow( x, n ); TAK: suma +=( pow( - 1, n + 1 ) ) *(( pow( x, n ) ) / n ); Ale coś jest nie tak z tym warunkiem przerywającym, sam nie wiem co :/ Przy takiej pętli: while( 1 ) { suma +=( pow( - 1, n + 1 ) ) *(( pow( x, n ) ) / n ); temp = suma; n++; if( fabs( suma - temp ) < e ) break; } cout << "Dla przyblizenia e=" << e << " ln(1+x)=" << setprecision( 15 ) << suma << endl;
Program podaję na wyjściu to co się wpisuje za x a nie prawidłowy wynik. |
|
pekfos |
» 2014-11-04 17:27:36 temp = suma;
if( fabs( suma - temp ) < e ) break;
|
Różnica tak jakby wynosi zero.. |
|
Nedvid Temat założony przez niniejszego użytkownika |
» 2014-11-04 17:30:36 Faktycznie ale w takim razie jak dobrać te warunki żeby wszystko dobrze działało ? |
|
pekfos |
» 2014-11-04 17:39:02 suma +=( pow( - 1, n + 1 ) ) *(( pow( x, n ) ) / n ); temp = suma;
|
Na pewno zmienić tu kolejność. |
|
Nedvid Temat założony przez niniejszego użytkownika |
» 2014-11-04 17:47:53 Wynik bez zmian. |
|
Atexor |
» 2014-11-04 23:51:25 temp=suma; ma lecieć na koniec pętli (po warunku if'a)
"Błąd w obliczeniach" to tylko inny zapis. Wychodzi na to samo: http://i.imgur.com/xh97d4H.gif http://i.imgur.com/ZrYVJB5.gif
Dla np. x=1 i eps=0.03 już liczy, ale nadal nie wiem czemu nie sumuje tych liczb mimo "suma+=", więc w tym Ci nie pomogę... |
|
Osa |
» 2014-11-05 01:15:13 Witam,
również rozwiązuję to zadanie, ale jestem na trochę wcześniejszym etapie. Otóż po zlokalizowaniu błędu zostawiłem tylko działający kod + linijkę, która zwraca niepoprawną wartość:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[]) { printf("Podaj liczbe z zakresu -1<x<=1.\n"); float x, przyblizenie; scanf_s("%f", &x); if (x <= -1 || x > 1) { printf("Ta liczba nie jest z przedzialu (-1;1>!!!\n"); } else { printf("Podaj przyblizenie\n"); scanf_s("%f", &przyblizenie); printf("%f", &przyblizenie); }
return 0; }
Otóż przebieg pracy programu wygląda tak:
Podaj liczbe z zakresu -1<x<=1. <podaję prawidłową liczbę, nieprawidłowe program prawidłowo odrzuca> Podaj przyblizenie <podaję jakąkolwiek liczbę, powinna ona być typu float, więc na razie nie zaprzątam sobie głowy tym, czy ma to sens w zadaniu, ale czy jest typu float, na przykład 0.1> <konsola zwraca mi to: 0.000000 , nie mam pojęcia dla czego>
Co tu jest źle?
|
|
1 « 2 » 3 |