Seite 1 von 1

Array langsam - irgendwelche Ideen? (Berechnung von PI)

Verfasst: 10.06.2011 13:08
von Tombi
Guten Tag zusammen.
Sobald ich eine sehr große Array dimensioniere, dauert der ganze Vorgang ewig. Selbstverständlich.

Leider ist das hier nur sehr unangebracht, da ich gerne testweiße z.B. mal 100.000 Nachkommastellen von PI errechnen möchte. /:->

Code: Alles auswählen

Procedure Rechne(n)
  
  Dim Kette.Kette(Int(10 * n / 3))

StellenFest = 0
For x = 1 To Int(10 * n / 3)
  Kette(x) = 2
Next

For x = 1 To n
  
  For m = Int(10 * n / 3) To 1 Step -1
    Kette(m) = Kette(m) * 10
    
    ; DoEvents / Unterbrechen
  Next
  
  For m = Int(10 * n /3) To 2 Step -1
    Quotient = Kette(m) / (2* m - 1)
    Kette(m) = Kette(m) % (2 * m - 1)
    Kette(m - 1) = Kette(m -1) + (Quotient * (m - 1))
    
    ; DoEvents / Unterbrechen
  Next
  
  Quotient = Kette(1) / 10
  Kette(1) = Kette(1) % 10
  
  If (Quotient <> 9) And (Quotient <> 10)
   Zahl = Quotient
   StellenFest = x
  EndIf
 
   If Quotient = 9
   Zahl = Quotient
  EndIf
  
  If Quotient = 10
   For m = StellenFest To x
    Zahl + 1
    If Zahl = 10 : Zahl = 0 : EndIf
   Next
   StellenFest = x
   Zahl = 0
 EndIf
 
  Debug Zahl
   
 Next
 
EndProcedure

xyz = CreateThread(@Rechne(), 100000)
WaitThread(xyz)
Irgendwelche Ideen?

Re: Array langsam - irgendwelche Ideen? (Berechnung von PI)

Verfasst: 10.06.2011 13:36
von shadow
Was mir gleich auffällt ist, dass du die selben Berechnungen wiederholt durchführst. Speichere doch das Ergebnis der Berechnung in einer Variablen und nutze dann diese. So sparst du bestimmt einiges an Rechenzeit...

Und versuch es mal mit einer LinkedList(), da du ja imemr nur auf das letzte Element des Arrays zugreifst. So sparst du dir die Initialisierung und den ständigen indizierten Aufruf aus dem Array heraus :wink:

Re: Array langsam - irgendwelche Ideen? (Berechnung von PI)

Verfasst: 10.06.2011 16:15
von STARGÅTE
Zu aller erst mal: Dein Code läuft so nicht! Bitte Ausführbaren Code posten!
Zum zweiten: "dauert der ganze Vorgang ewig" Welcher Vorgang ? Mit oder ohne Debugger ?
Zum dritten:
Warum schreibst du "Dim Kette.Kette", wenn du innerhalb des Codes direkt mit dem Pointer der Felder rechnest:
"Kette(m) * 10"
Da kann doch nur Müll rauskommen.

Normalerweise würdest du schon hier ein Fehler bekommen:

Code: Alles auswählen

Kette(x) = 2
---------------------------
PureBasic
---------------------------
Zeile 3: Kann einer Struktur keinen Wert zuweisen.
---------------------------
OK
---------------------------
EDIT:
Sachen wie:

Code: Alles auswählen

For x = 1 To Int(10 * n / 3)
sind unglaublich langsam, weil du mit JEDEM Schleifendurchlauf erneut Int(10 * n / 3) berechnest.
Dort immer erst zwischenergebnisse nutzen !