Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pi kwadrat

Ostatnio zmodyfikowano 2014-03-15 00:25
Autor Wiadomość
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 :)
P-106304
michal11
» 2014-03-13 21:02:58
C/C++
double suma = 0;

for( int i = 1; i < n; i++ )
{
    suma = 1 /( i * i );
}

suma *= 12;
P-106312
pekfos
» 2014-03-13 21:14:52
Ten kod nie wygląda, jakby miał zamiar działać.
P-106316
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ć?
P-106321
DaiGyakusatsu
» 2014-03-13 21:55:31
O coś takiego chodziło ;> ?
C/C++
#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;
}
P-106323
michal11
» 2014-03-13 22:10:35
Przepraszam nie zwróciłem uwagi na znaki. Wersja poprawiona.

C/C++
double suma = 0;

for( int i = 1; i < n; i++ )
{
    if( i % 2 == 0 ) // parzyste
    {
        suma -= 1 /( i * i );
    }
    else if( i % 2 == 1 ) //nie parzyste
    {
        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
P-106324
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 :)
P-106327
pekfos
» 2014-03-13 22:33:46
Dalej nie działa.
C/C++
suma -= 1./( i * i );
Jedna kropka, a tak wiele zmienia.. ;)
P-106329
« 1 » 2
  Strona 1 z 2 Następna strona