# JAVA: Problem mit Pi



## Bierseppi (11. Oktober 2010)

Hallo Programmierer,
ich lerne seit 2 Kahren in der Schule Java und beschäftige mich daheim auch damit und auch mir C++.
Leider haben wir in Informatik eine Aufgabe zur Berechnung von Pi bekommen.
Dabei haben wir eine kleine Hilfe bekommen und zwar 3 Berechnungsmöglichkeiten:
1.   pi/2=2*2*4*4*6*6*8*8*10*10.../1*3*3*5*5*7*7*9*9*11*11*...

2.   pi*pi/6=1/1+1/4+1/9+1/16+1/25+1/36...1/n*n

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

Ich habe zu den ersten beiden Möglichkeiten versucht es in BlueJ umzusetzen und bin leider gescheitert.
Ich poste euch mal den Java Code zur 1. Möglichkeit:


Spoiler





```
import java.io.*;
import java.text.DecimalFormat;
class Pi
{
public static void main (String[]args)
{    
    int b,x,y,pi,z;
    
    System.out.println("Eingabe der Bereschnungsgenauigkeint :");
    b=Eingabe.IntZahl();
    x=2;
    y=1;
    pi=0;
    for (z=1;z<=b;z++)
    {
      pi=pi/2;
      pi=(x*x)/(y*y);
      x=x+2;
      y=y+2;
    }
    System.out.println("Pi berägt: "+pi+"  bei "+b+" Stellen" );
}
}
```




Kann mir da wer bist Morgen Abend weiterhelfen denn am Mittwoch brauche ich das Prog wenns noch bist Mittwoch ca 10Uhr vormittags im Net ist dann passts auch dann kann ichs mir vor der Hausaufgabenabgabe noch runterziehen.



Ich möchte nur wissen was ich Falsch gemacht habe nicht dass ich gegen irgendwelche Forenregeln schreibe Dies ist auch eine Hausaufgabe auf freiwilliger Basis ich möchte nur dass ich weis wie das geht.


----------



## rabe08 (11. Oktober 2010)

Benutzt Du hier pi=pi/2 die variable nicht selbstrefferentiell?


----------



## UnnerveD (12. Oktober 2010)

Das Problem ist in erster Linie BlueJ selbst, da dieses zB. keine static main Methode kennt.

Beste Herangehensweise ist:
1) Erstellen eines Standardkonstruktors
public PI()
{
eingabe = 0;
}

2)Erstellen einer Methode zum Abfragen der Berechnungsgenauigkeit
public void setzeGenauigkeit(int genauigkeit)
{
eingabe = genauigkeit;
}

3) Methode erstellen zur Berechnung von Pi
public double berechnePI()
{
Logik
}

Danach kannst du das Ganze kompilieren und erstellst ein Objekt "Pi1" mittels der grafischen Oberfläche - diese wird unten im BlueJ Fenster abgelegt. Dieses Objekt Pi1 hat nun mehrere Methoden nämlich setzeGenauigkeit(int ...) und berechnePi(). Durch Rechtsklick auf das Objekt werden diese sichtbar und lassen sich auswählen - in dem aufpoppenden Fenster kannst du dann deine Genauigkeit eingeben und anschließend Pi berechnen lassen.

Beispiel folgt gleich...

MfG

Edit: Beispieldatei angehängt


----------



## Bierseppi (12. Oktober 2010)

und ich muss die berechnung jetzt in den  public double berechnePI bereich eingeben oder ??

EDIT: also wir haben das bis jetzt immer mit dem public static void main gemacht


----------



## bingo88 (12. Oktober 2010)

Versuche mal anstatt

```
int b,x,y,pi,z;
```
dies hier:

```
double b,x,y,pi,z;
```

Du hast nämlich sonst bei den Schritten a/b eine Integer-Division und da kommen halt immer nur ganze Zahlen raus.


----------



## UnnerveD (12. Oktober 2010)

Bierseppi schrieb:


> und ich muss die berechnung jetzt in den  public double berechnePI bereich eingeben oder ??
> 
> EDIT: also wir haben das bis jetzt immer mit dem public static void main gemacht



Musst du - Ja.

Prinzipiell ist die static main auch nicht falsch - aber Bluej kann damit nichts anfangen.

Wenn du lieber mit der static main arbeiten möchtest, empfiehlt sich der Einsatz von "Eclipse".

MfG

Edit: 
Schau dir ruhig auch die Beispieldatei an, damit sollte der Einstieg recht flüssig von statten gehen.


> pi=pi/2;
> pi=(x*x)/(y*y);
> x=x+2;
> y=y+2;


Diese Berechnung ist zudem mathematisch inkorrekt 

Edit2:
Ich habe mittlerweile je eine komplett funktionsfähige Version für BlueJ und Eclipse fertiggestellt.
Wenn du irgendwo nicht weiterkommst - frag ruhig nach, wir bekommen das schon hin bis heute Abend .


----------



## Infrarot (13. Oktober 2010)

Abend! Bin beim Stöbern auf diesen Thread gestoßen.

Was die Ermittlung von Pi angeht, kann ich nur empfehlen ein entsprechendes Mathematik-Buch aufzuschlagen oder (schnell, einfach, übersichtlich) den Artikel bei Wikipedia nachzulesen. Da tauchen dann die ganzen Gebilde auf, mit denen sich NÄHERUNGSWERTE bestimmen lassen. "Berechnungsgenauigkeit" auf bestimmte Anzahl von Stellen ist eigentlich falsch und falsch formuliert.

In deinem Code steht:


> x=2;
> y=1;
> [...]
> pi=(x*x)/(y*y);


Das bedeutet aber soviel, wie "(2/1) mal (2/1)" ist aber wegen der Formel für pi/2 nicht korrekt. Sonst würde es ja pi/2=(2*2*4*4...)/(1*1*3*3...) lauten.

Hab die Zeilen ebenfalls zusammengestellt (Verwende NetBeans), allerdings gibt es erst brauchbare Brüche bei b>>1000. Ist das bei dir auch so UnnerveD?


----------



## UnnerveD (14. Oktober 2010)

Also ich erreiche bei 500 Durchläufen einen genauen Näherungswert bis zur 2ten Nachkommastelle, bei 1000 bis zur 3ten Nachkommastelle.
So richtig genau wird es aber erst so bei 10000/20000 Durchläufen.
Ich habe im Anhang mal die Variante für BlueJ angehängt und dann noch die für Eclipse, wo jeweils noch die Kontrollwerte mit angezeigt werden.
(Für alle die es interessiert)

MfG


----------



## Bierseppi (14. Oktober 2010)

also ich hab  hab jezt die richtige berechnung und auch so ab 500 berechnungen ab der 2.  nachkommastelle eine richtige berechnung


----------



## Infrarot (14. Oktober 2010)

Ok mit der Anzahl an Durchführungen und den zugehörigen Nachkommastellen stimmt das. Ich hatte nach der "Programm"-Fertigstellung 10^5 eingetippt und zusätzlich Zeilen eingefügt, um mir die Faktoren und Zwischenwerte von Pi/2 anzeigen zu lassen. Die Berechnung hat dann schon einige Sekunden in Anspruch genommen (vllt. 30 s).

@Bierseppi: Toll, wenn es funktioniert. Wodurch hast du die Fehler nun finden und beseitigen können?


----------



## Bierseppi (14. Oktober 2010)

ja im informatik unnterricht hab ich mich ein bisschen gespielt damit da ich falst als einziger damit daheim begonnen hab


----------

