lvcky Temat założony przez niniejszego użytkownika |
[C++] Obliczanie sumy (PI) wzór Leibniza na liczbę Pi. » 2014-11-06 23:21:00 Napisać program obliczający: (suma od n=0 do nieskończoności) z (-1)^n/2n+1=1-1/3+1/5-1/7+... Jest to wzór Leibniza na liczbę Pi. dla wczytanego wcześniej n. Wynik pomnożyć przez 4 i wyświetlić. Jaka to liczba? Kod który napisałem int n; float wynik = 0; cout << "Podaj liczbe " << endl; cin >> n;
for( int i = 0; i <= n; i++ ) { wynik +=( pow( - 1.0, i ) ) /( 2 * i + 1 ); cout << wynik * 4 << endl; } Nie wiem co jest nie tak ale program powinien wyswietlać liczby rosnąco az jak najblizej liczby PI, u mnie nie wyświetla ich w poprawnej kolejnosci. Proszę o pomoc. |
|
Monika90 |
» 2014-11-07 00:04:20 Dlaczego uważasz że powinien rosnąco? |
|
Atexor |
» 2014-11-07 00:08:27 suma=o
Dla i=0 wynik to 1 suma=suma+1=1
Dla i=1 wynik to -1/3 suma=1-1/3=2/3 ~0,666
Dla i=2 wynik to 1/5 suma=2/3+1/5 ~0,86666
Dla i=3 wynik to -0,1429 suma=0,8666-0,1429=0.7237
Co się zgadza z Twoim programem. Zauważ, że podnosisz minus jeden do potęgi, i przez to raz otrzymasz liczbę dodatnią, raz ujemną. |
|
lvcky Temat założony przez niniejszego użytkownika |
» 2014-11-07 00:08:39 Skoro w pętli zaczynam od zera i każe mu zwiększać "i" o jedno w góre to tak to logicznie rozumiem.
Dla np i=5 pojawiaja sie w konsoli liczby: 4 2,66667 3,46667 2,89524 3,33968 2,97605
|
|
Atexor |
» 2014-11-07 00:24:09 Wybacz, zapomniałem dopisać - usuń mnożenie w wyświetlaniu wyniku. Najlepiej sam ręcznie (z kalkulatorem) przemnóż pierwszych wartości tego działania i zobaczysz regułę, że będziesz naprzemiennie "dodawał i odejmował", bo niektóre liczby będą ujemne dzięki podnoszeniu -1 do potęg nieparzystych. |
|
lvcky Temat założony przez niniejszego użytkownika |
» 2014-11-07 00:29:35 Chyba sie nie rozumiemy. Jest to wzór Leibniza na PI z którego wynika ze zeby to Pi uzyskac musze wynik pomnozyc przez 4. |
|
Atexor |
» 2014-11-07 01:08:40 Masz rację, niezbyt... Może spróbuję tak: Załóżmy, że wykonujesz pewne matematyczne operacje na zmiennej liczba (dla i=0): Liczba=( pow( - 1.0, i ) ) /( 2 * i + 1 ); Dla i=0 wynik jaki otrzymasz to 1, bo w liczniku (-1)^0 to 1, zaś w mianowniku 2*0+1=1. Jeden przez jeden to 1. Następnie za pomocą tej linijki: cout << wynik * 4 << endl; Wywołujesz strumień cout wyświetlający Twoją LICZBĘ, ale pomnożoną cztery. Te przemnożenie jest tylko "podczas wyświetlania" i nie ma wpływu na liczbę. Nadal wynosi ona 1. Następnie (kolejna iteracja pętli) wykonujesz znowu to samo, ale i=1, więc wynik jest inny. Jaki? Licznik: (-1)^1= -1 Mianownik: 2*1+1=3 Liczba= -1/3 Ale: w Twoim programie jest sumowanie tych liczb z poszczególnych obiegów pętli: liczba+=<operacje_matematyczne> Tak więc: 1 + (-1/3)=0,666666 I tak dalej i tak dalej. Prościej nie potrafię wyjaśnić. Trochę przekształciłem Twój kod. Skompiluj go i zobacz na ekranie co Ci wypisało. #include <iostream> #include <math.h>
using namespace std;
int main() { int n = 0; float wynik = 0, liczba = 0; cout << "Podaj liczbe " << endl; cin >> n; for( int i = 0; i <= n; i++ ) { liczba =( pow( - 1.0, i ) ) /( 2 * i + 1 ); cout << "Dla i= " << i << " liczba=" << liczba << endl;; cout << "Dla i=" << i << " wynik+liczba " << wynik << " + " << liczba; wynik += liczba; cout << " = " << wynik << endl << endl; } system( "PAUSE" ); return 0; }
|
|
« 1 » |