 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ich eben
Anmeldungsdatum: 05.12.2008 Beiträge: 12 Wohnort: zu Hause
|
Verfasst am: 30.10.2010, 15:31 Titel: Binärdarstellung von sehr langen Zahlen |
|
|
Hi, Leute.
Ich hab ein Problem. Ich habe ein Programm geschrienen, das Zweierpotenzen ausrechnet(2^x), wobei x durchaus mal 10000 oder höher sein kann. Jetzt habe ich das Problem, dass ich die Zahlen nicht kontrollieren kann und habe mir überlegt dies über die Binärdarstellung zu tun.
Hier der Code:
Code: | DECLARE FUNCTION Pot(a() AS INTEGER,ex AS INTEGER,Start AS DOUBLE)AS INTEGER
DECLARE FUNCTION Zeit(Starttime AS DOUBLE,Endtime AS DOUBLE)AS STRING
DIM AS STRING Zahl
DIM AS INTEGER ex,I,J,K,L,Ste,Lan
DIM AS DOUBLE Start,Ende
DIM SHARED AS INTEGER Stellen=100,Verg
REDIM a(Stellen) AS INTEGER'Dynamisches Array erstellen
a(Stellen)=2
SCREENRES 1024,768
INPUT "Gib nen Exponenten ein: ",ex
OPEN "2^"&ex &".txt" FOR OUTPUT AS #1'Datei mit Dateiname=Aufgabe erstellen
Zahl=""'Zahl zurücksetzten
Start=TIMER
Pot(a(),ex,Start)'Function aufrufen
Ende = TIMER
FOR J = 0 TO Stellen'Zahl zusammensetzen...
Zahl=Zahl+STR(a(J))
NEXT J
Zahl=LTRIM(Zahl,"0")'...und kürzen
CLS'LINE (0,0)-(1024,100),0,BF
LOCATE 1,1
?"Gib nen Exponenten ein:";ex
?
?"GrӇe des Arrays: ";Stellen'Informationen ausgeben
?"Letzte VergrӇerung des Arrays bei 2 ^ ";Verg;"."
?"L„nge der Zahl: ";LEN(Zahl);" Stellen."
?
?Zahl'Zahl anzeigen
PRINT #1, Zahl'Zahl in Datei schreiben
?
?"Zum Beenden beliebige Taste druecken!"
?
?"Der Vorgang hat ";Zeit(Start,Ende);" gedauert!"'Zeit anzeigen
SLEEP
CLOSE
FUNCTION Pot(a() AS INTEGER,ex AS INTEGER,Start AS DOUBLE)AS INTEGER
DIM AS INTEGER erg,I,J,K,L
DIM AS DOUBLE Je,Zeit2
DIM AS STRING Zeit1
FOR J = 1 TO ex-1'Zählschleife für die Exponenten
IF a(1)<>0 THEN'Wenn Array voll dann vergrößern...
Verg=J
Stellen=Stellen+100
REDIM PRESERVE a(Stellen) AS INTEGER
FOR K = Stellen TO 100 STEP -1'...und alles zurechtschieben
a(K)=a(K-100)
NEXT K
FOR L = 0 TO 99
a(L)=0
NEXT L
END IF
FOR I AS INTEGER = 0 TO Stellen'Inhalt des Arrays verdoppeln
erg=a(I)*2
IF a(I+1)*2>=10000 THEN erg=erg+1
IF erg>=10000 THEN erg=erg-10000
a(I)=erg
NEXT I
Je=TIMER
Zeit1=RTRIM(Zeit(Start,Je),"Sek")
LOCATE 1,40
Zeit2=VAL(Zeit1)
PRINT USING "##.## Sek";Zeit2'Laufzeit anzeigen
NEXT J
RETURN -1
END FUNCTION
FUNCTION Zeit(Starttime AS DOUBLE,Endtime AS DOUBLE)AS STRING'Zeit berechnen
DIM AS DOUBLE Diff1,Min,Sek
Diff1=Endtime-Starttime
Min=Diff1/60
Sek=Frac(Min)*60
Min=INT(Min)
IF Min<>0 THEN
FUNCTION=STR(Min)+" Min "+STR(Sek)+" Sek"'Ausgabe zusammensetzten
ELSE
FUNCTION=STR(Sek)+" Sek"'Ausgabe zusammensetzten
END IF
END FUNCTION
|
Ich weiß nicht, wie ich eine Zahl, die so groß ist, dass sie in keinen Datentyp passt, in Binärschreibweide darstellen lassen kann...
Kann mir bitte jemand helfen???  _________________ Der Kreis ist eine geometrische Figur, bei der an allen Ecken und Enden gespart wurde. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 30.10.2010, 16:19 Titel: |
|
|
Wenn ich das richtig verstanden habe, dann errechnest du zB 2^10000 als Dezimalwert und willst das dann noch als Binärwert haben.
Versuch es doch einfach mit BIN.
FreeBASIC kann mit so großen Zahlen zwar nicht von Haus aus umgehen und wenn du die fertig errechnete Zahl als Integer an die Funktion geben würdest, wäre das Ergebnis falsch, aber als Exponent macht FB es richtig. |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 30.10.2010, 18:46 Titel: |
|
|
@MOD: Sicher?
Code: | Print Bin(2^100)
Print Len(Bin(2^100))-1 ' sollte 100 sein
Sleep |
Die zweite Zeile gibt 63 aus, also nimmt FB den größtmöglichen Datentyp, und das ist ULongInt. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 30.10.2010, 19:04 Titel: |
|
|
Du hast recht, das stimmt doch nicht so ganz.
Andere Möglichkeit: im FreeBASIC-Verzeichnis unter "inc/big_int" gibt es Funktionen, die das Rechnen mit großen Zahlen ermöglicht. Unter "examples/libraries/big_int" gibt es noch Beispiele dazu. Hab nie damit gearbeitet, aber evtl kann es das, was benötigt wird. |
|
Nach oben |
|
 |
ich eben
Anmeldungsdatum: 05.12.2008 Beiträge: 12 Wohnort: zu Hause
|
Verfasst am: 31.10.2010, 20:49 Titel: |
|
|
Ich habe mir die Dateien angeschaut und hab nicht sehr viel verstanden. Kennt jemand eine Seite, auf der diese big_int-Funktionen erklärt werden?? (Aber danke für den Hinweis!) _________________ Der Kreis ist eine geometrische Figur, bei der an allen Ecken und Enden gespart wurde. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
|
Nach oben |
|
 |
ich eben
Anmeldungsdatum: 05.12.2008 Beiträge: 12 Wohnort: zu Hause
|
Verfasst am: 03.11.2010, 17:17 Titel: |
|
|
Danke für die Seite. Werd mich mal damit beschäftigen...
edit: Habs hinbekommen. Um Fehler im Ursprung zu vermeiden erzäuge ich Das Ergenis als String in Binärschreibweise und wandle diesen dann mithilfe der Big_Int-Bibliothek in Dezimalschreibweise um.
Danke für eure Hilfe
ich eben _________________ Der Kreis ist eine geometrische Figur, bei der an allen Ecken und Enden gespart wurde. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|