Gå til innhold

Beregne pi vha Leibniz formel


Anbefalte innlegg

Jeg har fått en oppgave å skrive et program i C++ som beregner pi ved hjelp av Leibniz formel.

pi=4*(1-1/3+1/5-1/7+1/9-1/11...)

 

Man skal kunne lese inn verdien på den største nevneren i summen.

Eks: Du skriver inn 7, da skal alle brøker tom. 1/7 tas med i beregninga.

 

Hvordan skal jeg få til å skifte mellom addisjon og subtraksjon i beregninga?

 

(Vi har ikke lært så mye enda, begrenser seg til enkle do, do-while og for-sløyfer)

Lenke til kommentar
Videoannonse
Annonse

Det enkleste er å bruke en bool verdi som du endrer mellom hver gang, og avhengig av hva den er enten trekker fra eller legger til...

 

kjapp pseudokode for en måte å løse problemet på...

Klikk for å se/fjerne innholdet nedenfor

bool pluss;
float min_pi = 1;
//use a loop for the values from 3 to n, increment by 2
 //if pluss
   //add 1/i to min_pi, set pluss to false
 //else
   //subtract 1/i from min_pi, set pluss to true

//multiply min_pi by 4

  • Liker 1
Lenke til kommentar

Du går ikke på HiST, vel?

 

Uansett, ferdig program:

 

Klikk for å se/fjerne innholdet nedenfor
#include <iostream.h>
#include <math.h>

int main() {
 double nevner, piest, teller, i;

 cout << "Skriv inn verdien til den stoerste nevneren i "
   << "summen (0 avslutter):\n";

 cin >> nevner;

 while(nevner != 0) {
piest = 0.0;
teller = 4.0;

for(i = 1; i <= nevner; i = i + 2) {
  piest = piest + teller/i;

  teller = -teller;
}

cout << "\npi er estimert til " << piest
	 << "\nM_PI er " << M_PI;

cout << "\n\nSkriv inn verdien til den stoerste nevneren i "
	 << "summen (0 avslutter):\n";

cin >> nevner;
 }

 return 0;
}

Hvis du ønsker ANSI-kompatibilitet på det ovenstående, så bytt ut #include <iostream.h> med #include <iostream>, etterfulgt av linjen using namespace std;.

 

Edit: Alternativt kan du gjøre bruk av en rekursiv funksjon, dvs. en funksjon som kaller seg selv:

 

Klikk for å se/fjerne innholdet nedenfor
#include <iostream>
#include <math.h>

using namespace std;

double cell(int n, int nevner);

int main() {
 int nevner;
 double piest;

 cout << "Skriv inn verdien til den stoerste nevneren i "
   << "summen (0 avslutter):\n";

 cin >> nevner;

 while(nevner != 0) {
piest = 4 * cell(0, nevner);

cout << "\npi er estimert til " << piest
	 << "\nM_PI er " << M_PI;

cout << "\n\nSkriv inn verdien til den stoerste nevneren i "
	 << "summen (0 avslutter):\n";

cin >> nevner;
 }

 return 0;
}

double cell(int n, int nevner) {
 double number;

 number = pow(-1, n)/(2 * n + 1);

 if(2 * ++n + 1 <= nevner) {
number += cell(n, nevner);
 }

 return number;	
}

I dette tilfellet er dette neppe særlig ytelsesøkende, i hvert fall ikke i C++, men det er uansett en artig programmeringsøvelse.

Endret av ePsiLON47
Lenke til kommentar
  • 4 måneder senere...
Det enkleste er å bruke en bool verdi som du endrer mellom hver gang, og avhengig av hva den er enten trekker fra eller legger til...

My smartere å ha en int som du ganger med -1 for hver gjennomgang.

int x = 1;
int pi = 0;
int eq = 0;

while(...)
x = -x;
eq = .. * x;
pi += eq

 

EDIT:

ePsiLON47 gjør visst det samme over her

Endret av Peter
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...