skymaja Temat założony przez niniejszego użytkownika |
Pi kwadrat » 2014-03-13 20:38:12 Witam
Mam do napisania następujący program:
Korzystając z rozwinięcia liczby π^2 w szereg liczbowy w postaci:
π^2 = 12 ( 1/1^2 - 1/2^2 + 1/3^2 - 1/4^2 + ... )
znaleźć wartość liczby π z dokładnością do n miejsc po przecinku.
Co do tych miejsc po przecinku znalazłam już, że trzeba będzie setprecision wykorzystać (tak?), ale nie mam w ogóle pomysłu jak się zabrać za ten szereg... W jaki sposób to zapisać w c++?
Miałam dopiero trzy zajęcia z c++, więc będę wdzięczna za proste wytłumaczenie :) |
|
michal11 |
» 2014-03-13 21:02:58 double suma = 0;
for( int i = 1; i < n; i++ ) { suma = 1 /( i * i ); }
suma *= 12;
|
|
pekfos |
» 2014-03-13 21:14:52 Ten kod nie wygląda, jakby miał zamiar działać. |
|
skymaja Temat założony przez niniejszego użytkownika |
» 2014-03-13 21:48:43 no.. nie działa :(
1/(i*i) wylicza jako 0 dla wszystkiego większego od 1. Poza tym w tym szeregu jest plus przed liczbami nieparzystymi w mianowniku i minus, jeśli potem w mianowniku jest liczba parzysta, więc to na pewno nie jest taki prosty kod, jak napisałeś michal11.
Ma ktoś pomysł jak to zrobić? |
|
DaiGyakusatsu |
» 2014-03-13 21:55:31 O coś takiego chodziło ;> ? #include <iostream> #include <stdint.h> #include <math.h> using namespace std;
int main( void ) { const uint32_t n = 10000000; long double myPi = 0; for( uint32_t i = 1; i <= n; i++ )( i % 2 ) == 1 ? myPi += 1 / pow( i, 2 ) : myPi -= 1 / pow( i, 2 ); myPi *= 12; cout.precision( 15 ); cout << myPi << endl; return 0; }
|
|
michal11 |
» 2014-03-13 22:10:35 Przepraszam nie zwróciłem uwagi na znaki. Wersja poprawiona. double suma = 0;
for( int i = 1; i < n; i++ ) { if( i % 2 == 0 ) { suma -= 1 /( i * i ); } else if( i % 2 == 1 ) { suma += 1 /( i * i ); } }
suma *= 12;
Edit. Jak tak na to patrze to ten kod nie wygląda najlepiej ale tak chyba będzie łatwiej zrozumieć to skymaja |
|
skymaja Temat założony przez niniejszego użytkownika |
» 2014-03-13 22:33:04 Teraz Twój program michal11 wypisuje 12, niezależnie od wartości n.
Twój DaiGyakusatsu jest prawie dobry, tzn. program miał wypisywać pi a nie pi kwadrat, więc jeszcze trzeba spierwiastkować, no ale to mały problem. Poza tym podał z przybliżeniem do 13 miejsc a nie 15, ale to rozumiem, że tak działa precision, że liczy łącznie z przecinkiem i liczbą przed przecinkiem?
Ale główną uwagę mam taką, że go nie rozumiem ;) Jakieś zaawansowane struktury wykorzystałeś, których nie mieliśmy jeszcze ;)
Co znaczy? const uint32_t n = 10000000; I ten znak zapytania i dwukropek w pętli for? To jakis inny sposób na zapisanie warunków if, else? Będę wdzieczna za wytłumaczenie :) |
|
pekfos |
» 2014-03-13 22:33:46 Dalej nie działa. Jedna kropka, a tak wiele zmienia.. ;) |
|
« 1 » 2 |