# Pi berechnen



## stealthpump (31. Jan 2007)

Also die Aufgabenstellung lautet: ein programm zu erstellen, um Pi auf 5 Dezimalstellen genau zu berechnen.

die formel für Pi ist 1 - 1/3 + 1/5 - 1/7 + 1 /9 .... * 4
so nun hab ich folgendes programm geschrieben:


```
class pi {
	public static void main(String[] arg) {
		int i = 1;
		double sum = 0.0;
		
			do {
				sum = sum + ( 1/i - 1/(i + 2) );
				i = i + 4;
			} while ( i > 3000);
		
		double pi = sum*4;	
		Out.println(pi);
	
		
	}
}
```

Nur irgendwie gibt er mir immer nur 1.0 aus...???? warum rechnet er nicht??

Das mit " while (i > 3000) is zum ignorieren, das hab ich einfach mal hingeschrieben, das halt irgendwas dort steht. aber da is auch nicht das problem...

der Lösungscode hab ich auch - den seht ihr unten, doch irgendwie is de formel ja gleich die ich da geschrieben hab wie vom lösungscode... aber es funktioniert nicht... ich würde da mal gerne um Hilfe bitten!!



```
class A1 {
	
	public static void main(String[] arg) {
		double n = 1.0, n0 = 0.0;
		int i = 3, sign = - 1;
		while (Math.abs(n - n0) > 0.0000025) { // 0.00001 / 4
			n0 = n;
			n = n + sign * (1.0 / i);
			sign = - sign;
			i = i + 2;
		}
		double pi = 4 * n;
		Out.println("pi = " + pi);
	}
}
```


----------



## florian1x (31. Jan 2007)

ich glaub dein quellcode is kommplett falsch ich weiß auch nicht warum du i+4 rechnest 
ich shcua ma ob ich ne shcöne nachticht gebastelt kriege


----------



## Lim_Dul (31. Jan 2007)

Da ist das Problem:


> sum = sum + ( 1/i - 1/(i + 2) );


Rechte Summand, 1/i - 1/(i + 2), enthält nur Integer Werte und wird daher als Integer Rechnung ausgewertet, womit da generell 0 rauskommt (außer für i=1).

Schreib das mal so:

```
sum = sum + (1.0/i - 1/(i + 2.0));
```

Dann wird alles als double Rechnung ausgewertet


----------



## florian1x (31. Jan 2007)

also bei mir brechnet der mit dem code


```
public class Pi {
	public static double getPi(){
		double a,b;
    
		a = 2 * Math.sqrt(3);
		b = 3;
    
		while(a==b){
        	a = 2 * a * b / (a + b);
        	b = Math.sqrt(a * b);
		};
    
        return a;
	}
	public static void main(String[] args) {
		System.out.println(getPi());
	}
}
```

3.4641016151377544

wenn dus kürzer haben wills kannste dezimalformat benutzen


----------



## florian1x (31. Jan 2007)

ich krieg die streifen methode kleider net in java umgesetzt
hab noch nie java gehabt aber kp kannse ja mal veruschen

http://www.activevb.de/rubriken/kolumne/kol_21/pi.html


----------



## stealthpump (1. Feb 2007)

Okay danke für die schnellen Antworten! Werd das heute Vormittag mal ausprobieren!!
besten Dank auch!


----------



## DocRandom (1. Feb 2007)

florian1x hat gesagt.:
			
		

> ich krieg die streifen methode kleider net in java umgesetzt
> hab noch nie java gehabt aber kp kannse ja mal veruschen
> 
> http://www.activevb.de/rubriken/kolumne/kol_21/pi.html


..hmm komisch.
Den VB-Code vom PI hast ja auch 1:1 umsetzen können!
Woran scheitert es dann bei der Streifen-Methode?
Das einzige was störend ist, ist evtl. das 'DoEvents', was aber nur besagt, das das Programm, den Rest der Zeitscheibe an den Rechner abgibt und somit in diesem Fall nicht von nöten ist, da man/frau das ja mit nem Thread lösen kann.

mfg
DocRandom


----------



## florian1x (1. Feb 2007)

mhh ups ich meinte ich hatte noch nie basic
java bin ich scho recht gut 
auch wenn ich das erst seit einem halben jahr übe


----------

