Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Binärdarstellung von sehr langen Zahlen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ich eben



Anmeldungsdatum: 05.12.2008
Beiträge: 12
Wohnort: zu Hause

BeitragVerfasst am: 30.10.2010, 15:31    Titel: Binärdarstellung von sehr langen Zahlen Antworten mit Zitat

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??? weinen weinen
_________________
Der Kreis ist eine geometrische Figur, bei der an allen Ecken und Enden gespart wurde.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 30.10.2010, 16:19    Titel: Antworten mit Zitat

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.
Code:
Print Bin(2^ex)

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
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 30.10.2010, 18:46    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 30.10.2010, 19:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ich eben



Anmeldungsdatum: 05.12.2008
Beiträge: 12
Wohnort: zu Hause

BeitragVerfasst am: 31.10.2010, 20:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 31.10.2010, 21:25    Titel: Antworten mit Zitat

Erstes Ergebnis bei Google: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Big_int.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ich eben



Anmeldungsdatum: 05.12.2008
Beiträge: 12
Wohnort: zu Hause

BeitragVerfasst am: 03.11.2010, 17:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz