Hohe Zahlen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Hohe Zahlen

Beitrag 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)
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Zuletzt geändert von Kaeru Gaman am 03.07.2009 15:58, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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".
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag von Kaisky007 »

okay danke! :D
Antworten