Seite 1 von 1

Hohe Zahlen

Verfasst: 03.07.2009 15:44
von Kaisky007
Hi!
Ich habe mir mal ein Primzahlen rechner gebaut, habe jedoch das problem, das die zahlen zu hoch werden. Eine long variable kann ja nur bis ca. 4Milliaden oder so zahlen speichern. Gibt es vielleicht eine Möglichkeit es bis in die Billionen hinaus zu treiben?
Hier mein Primzahlen rechner:

Code: Alles auswählen

InitSprite()

InitKeyboard()

OpenScreen(800,600,32,"Vollbild")

MN.l = 2 ;MN: MalNehmen
P.l = 0 ;P: Primzahl
PP.l = 999999999999 ;PP: PrimzahlPrüfen

Repeat

For a=0 To 100000

If (PP / MN) * MN = PP
  PP + 2
  MN = 2
Else
  MN + 1
  If MN > PP / 1000000
    MN = 2
    P = PP
    PP + 2
  EndIf
EndIf

Next

StartDrawing(ScreenOutput())

DrawText(100,100,Str(P),RGB(255,255,255),RGB(0,0,0))
DrawText(100,150,Str(PP),RGB(255,255,255),RGB(0,0,0))
DrawText(100,200,Str(MN),RGB(255,255,255),RGB(0,0,0))

StopDrawing()
FlipBuffers()
ExamineKeyboard()

If KeyboardReleased(#PB_Key_Space)
  PP + 2
  MN1 = 2
  MN2 = 2
EndIf

Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 03.07.2009 15:48
von cxAlex
Probiers mal mit Quads, das sollte reichen (.q statt .l). Bei noch höheren Zahlen reichen die nativen Typen nicht mehr und du musst eigene verwenden.

Gruß, Alex

Verfasst: 03.07.2009 15:54
von Kaisky007
mhm...
Jetzt kommt zwar kein error mehr, aber er fängt nicht bei 999999999999 an sondern irgendwo bei -727300000...
wie kann ich denn eigene typen erstellen? :D

grüße kai

Verfasst: 03.07.2009 15:57
von Kaeru Gaman
> Jetzt kommt zwar kein error mehr, aber er fängt nicht bei 999999999999 an sondern irgendwo bei -727300000...

du musst auch aus allen Variablen Quads machen....

... und eine Variable einer For-Schleife kann auch kein Quad sein, also musst du wohl ne While-Schleife verwenden.

Verfasst: 03.07.2009 15:58
von Kaisky007
hab ich, geht trotzdem nicht hier :

mhm... while schleife kenne ich von einer anderen programmiersprache, ich weiß aber nicht wie man die hier anwendet und so

Code: Alles auswählen

InitSprite() 

InitKeyboard() 

OpenScreen(800,600,32,"Vollbild") 

MN.q = 2 ;MN: MalNehmen 
P.q = 0 ;P: Primzahl 
PP.q = 999999999999 ;PP: PrimzahlPrüfen 

Repeat 

For a=0 To 100000 

If (PP / MN) * MN = PP 
  PP + 2 
  MN = 2 
Else 
  MN + 1 
  If MN > PP / 1000000 
    MN = 2 
    P = PP 
    PP + 2 
  EndIf 
EndIf 

Next 

StartDrawing(ScreenOutput()) 

DrawText(100,100,Str(P),RGB(255,255,255),RGB(0,0,0)) 
DrawText(100,150,Str(PP),RGB(255,255,255),RGB(0,0,0)) 
DrawText(100,200,Str(MN),RGB(255,255,255),RGB(0,0,0)) 

StopDrawing() 
FlipBuffers() 
ExamineKeyboard() 

If KeyboardReleased(#PB_Key_Space) 
  PP + 2 
  MN1 = 2 
  MN2 = 2 
EndIf 

Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 03.07.2009 16:03
von Kaeru Gaman
nimm doch erstmal was anderes als den Fullscreen....

bis die auflösung umgeschaltet hat, ist die schleife doch schon x-mal durchgelaufen.

für so kleine dinger gibts doch Debug

Verfasst: 03.07.2009 16:08
von Kaisky007
ehm... das hat doch nichts mehr damit zu tun...
außerdem habe ich meine gründe das es fullscreen ist...
und das die schleife bis dahin schon xmal durchgelaufen ist spielt keine rolle...

wie kann ich denn eigene typen erstellen die bis ca trillionen gehen :D (wäre schön)

Verfasst: 03.07.2009 16:19
von Kaeru Gaman
nunja... Fullscreen kann ich grad nicht anwerfen, also kann ich den code jetzt auch nicht anwerfen um zu sehen wo das problem liegt.

... aber ich wage mal in Frage zu stellen, ob es das richtige für dich wäre, dich mit eigenen Spezialtypen rumzuschlagen, wenn du mit einer Long->Quad veränderung bei so einem mini-code nicht klarkommst.

Verfasst: 03.07.2009 19:58
von AND51
Kaisky007 hat geschrieben:wie kann ich denn eigene typen erstellen die bis ca trillionen gehen :D (wäre schön)
Indem du Strings statt Zahlen verwendest.
Nachteil: Stringzahlen sind nicht so schnell wie "normale" Zahlen und außerdem musst du dir eigene Prozeduren programmieren, wenn du zwei Stringzahlen addieren oder sonstwie miteinander verrechnen willst.

Es gibt aber bereits einige Codes hier im Forum, die du dafür verwenden kannst. Früher gab es das sogar als Lib, die nannte sich "BigNum".

Verfasst: 04.07.2009 19:29
von Kaisky007
okay danke! :D