Seite 11 von 12

Verfasst: 15.04.2007 12:04
von Fusselohr
Ich hab jetzt endlich weitergemacht <)
Ich hab aber ne "einfache" Frage ^^. Ich möchte es so machen ,dass das Prog. Pi erechnet. Daher meine Frage -> wie rechnet man Pi ?

Gruß Fusselohr

Verfasst: 15.04.2007 12:06
von a14xerus
also es gibt ja #PI,
aber ich denke, du willst selber eine genaue zahl mit einer bestimmten anzahl an Nachkommastellen haben.
Es gibt ein verfahren, wonach man Pi errechnet, such mal zb bei Wiki.
Es gibt auch Programme, die nichts andere tun.. zb 10.000 Nachkommastellen von Pi errechnen.. Dauert eben nur ein bissel.
Wenn du für deinen Taschenrechner nur die Zahl Pi zur verfügung stellen willst, nehm einfach #PI

edit: Pi für Java:

Code: Alles auswählen

public static double berechne_pi(int tropfenzahl) {
  double pi = 0;
  int innerhalb = 0;
  int gesamt = tropfenzahl;

  while (tropfenzahl > 0) { // generiere Tropfen und addiere je nach Zugehörigkeit
    double dotx = 2 * Math.random() - 1;
    double doty = 2 * Math.random() - 1;

    if (dotx*dotx + doty*doty <= 1) {
      // Punkt liegt innerhalb des Kreises
      innerhalb++;
    } else {
      // Punkt liegt außerhalb des Kreises
    }

    tropfenzahl--;
  }

  pi = 4*(double)innerhalb/gesamt;
  return pi;
}

Verfasst: 15.04.2007 12:29
von Fusselohr
Ich hätte halt gerne das der User eingibt wie viel stellen er von pi sehen möchte^^

und irgendwie kapier ich immer noch net wie ich pi ausrechnen soll^^

Verfasst: 15.04.2007 12:41
von a14xerus
ich habs mal in pb umgeschrieben und etwas verändert

Code: Alles auswählen

#genauigkeit = 10000000
#rand_genauigkeit = 100000
start = ElapsedMilliseconds()
Procedure.d pi(tropfenzahl.l)
  pi.d = 0
  innerhalb.l = 0
  gesamt.l = tropfenzahl
  
  While tropfenzahl > 0
    ; generiere Tropfen und addiere je nach Zugehörigkeit
    dotx.d = 2 * (Random(#rand_genauigkeit)/#rand_genauigkeit) - 1
    doty.d = 2 * (Random(#rand_genauigkeit)/#rand_genauigkeit) - 1
    If (dotx*dotx + doty*doty <= 1) 
      ; Punkt liegt innerhalb des Kreises
      innerhalb+1
    Else
      ; Punkt liegt außerhalb des Kreises
    EndIf
    
    tropfenzahl-1
  Wend
  
  pi = 4*innerhalb/gesamt
  ProcedureReturn pi
EndProcedure

MessageRequester("PI","Pi:"+Chr(9)+StrD(pi(#genauigkeit))+Chr(10)+"Zeit:"+Chr(9)+Str(ElapsedMilliseconds()-start)+" Ms")

Gedanke hinter der Sache:
Man nehme ein Quadrat.
in diesem Quadrat ist ein Viertelkreis
Nun setze man zufällig punkte in dieses Quadrat und man zählt, wie viele im Viertelkreis liegen, und wie viele nicht.
Natürlich ungenau , weil die Punkte ja zufällig gesetzt werden, dafür ist die konstante #genauigkeit, sie bestimmt die anzahl der punkte.
die konstante #rand_genauigkeit ist für die anzahl der Nachkommastellen bei random.
Spiel mal ein bisschen damit rum und gucke, wie die ausgaben aussehen.
Achtung: bei mir (1000MHz) hat das Beispiel oben ca 3 Sekunden gebraucht

Die Genauigkeit ist nicht der Hammer, aber es ist ein Ansatz.
Um genauer zu werden, vielleicht anstatt Kommazahlen, einfach sozusagen pi*1000000 nehmen um zu rechnen und nur zur anzeige das Komma setzen.
Desweiteren nicht die punkte zufällig nehmen, sondern in einem bestimmten Abstand, und somit auch die genauigkeit bestimmen.
Ich hoffe du verstehst was ich meine.
Ich gehe jetzt erstmal off und werde heute abend wieder vorbeischauen.

Verfasst: 15.04.2007 12:47
von Fusselohr
Hmm, bei mir kommt aber jedes mal was anderes :lol: obwohl der code gleich bleibt

Verfasst: 15.04.2007 12:50
von a14xerus
Fusselohr hat geschrieben:Hmm, bei mir kommt aber jedes mal was anderes :lol: obwohl der code gleich bleibt
Liegt am Random
Bei mir kam auch noch nie Pi raus (bis auf die ersten zwei nachkommastellen)

Verfasst: 15.04.2007 12:59
von Fusselohr
Kann mir vielleicht einer den kompletten Quellcode mit 100%iger genauigkeit geben. Bin erst in der 8.ten und hatte daher noch kein Pi. Blick überhaupt nimmer durch ^^

Verfasst: 15.04.2007 13:04
von DarkDragon

Verfasst: 15.04.2007 13:11
von Fusselohr
THX ^^ Jetzt muss ich das nur noch in eine Fensteranwendung umändern stimmts ?

Verfasst: 15.04.2007 20:04
von Fusselohr
Ich bin einfach zu blöd-- ich kriegs par tu nich hin die Konsolenanwendung in eine Windowanwendung mit einfacher Stringeingabe, nem "Pi berechnen"-Button und ner Ausgabe als Textbox zu machen---
Falls mir jemand helfen kann ... Ich hätt überhaupt nix dagegen <)