Array langsam - irgendwelche Ideen? (Berechnung von PI)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

Array langsam - irgendwelche Ideen? (Berechnung von PI)

Beitrag 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?
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

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

Beitrag 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:
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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 !
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten