PowerBASIC FORUM - Kirschbaum Software GmbH UBB.threads™ copyright by Infopop Corporation.

Hier helfen sich PowerBASIC Programmierer gegenseitig ..... >> Mathematik & PowerBASIC

Seiten in diesem Thema: 1
Josef KirschbaumAdministrator
Moderator

Registriert: 15.12.2002
Beiträge: 342
Wohnort: Emmering
Rechnen mit wirklich großen Zahlen neu
      #2836 - 16.01.2010 19:10

Obwohl alle PowerBASIC-Compiler mit einer großen Auswahl an numerischen Datentypen erfeuen, bleiben doch manchmal Aufgaben, wo man weitaus mehr als eine 18-stellige darstellbare Genauigkeit benötigt. Kürzlich war ich konfrontiert mit dem Problem, eine 32-stellige hexadezimale Zahl in eine Dezimalzahl umzurechnen.

Natürlich drängt sich zunächst die Frage auf, für welchen Zweck man überhaupt derart große Zahlen benötigt. In diesem Fall ging es um die Umwandlung eines MD5-Hashwertes in eine Dezimalzahl.

Nachdem ich hier im Forum und auch im amerikanischen Forum keinen passenden PowerBASIC-Quellcode gefunden habe, ist aus der Not das folgende kleine Programm entstanden.

Dies ist natürlich nur eine sehr schnelle und einfache Lösung und in keiner Weise optimiert. Für aufwändige mathematische Berechnungen gibt es mit Sicherheit andere und weitaus schnellere Verfahren. Dies ist lediglich eine Umsetzung davon, wie man in den ersten Schuljahren das Addieren und Multiplizieren erlernt. Die Berechnung beschränkt sich auf die gegebene Aufgabe und setzt voraus, dass der gegebene String tatsächlich eine zulässige hexadezimale Zahl darstellt. Mit den benutzten Funktionen kann man deshalb auch nur mit positiven Zahlen rechnen.

Code:
'Dieses Programm rechnet einen beliebig großen
'hexadezimalen Wert in eine Dezimalzahl um
'
'Die Anwendung prüft nicht auf evtl. ungültigen Aufbau der Hexzahl.
'Z.B. ungültig wäre 123OP45H und dabei würden bei einer derartigen
'Vorgabe lediglich alle ungültigen Zeichen entfert, damit eine
'error-freie Umwandlung durchgeführt werden kann.
'
'Eine weitere Fehlerbehandlung findet nicht statt, weil nach der
'Bereinigung der Vorgaben auf zulässige Werte keine weiteren Fehler
'mehr auftreten können
'
'Autor: Josef Kirschbaum
'Kontakt: http://www.powerbasic.de
'letzte Änderung: 16. Januar 2010
'Nutzung nur auf eigene Gefahr

#COMPILE EXE
#DIM ALL

'Addition von zwei beliebig großen, positiven, ganzzahligen Dezimalzahlen
FUNCTION sAddition(sDez1 AS STRING, sDez2 AS STRING) AS STRING
LOCAL i AS LONG
LOCAL bAdd AS BYTE
LOCAL bMerk AS BYTE
LOCAL sAdd AS STRING

sDez1$= RETAIN$(sDez1$, ANY "0123456789")
sDez2$= RETAIN$(sDez2$, ANY "0123456789")

IF LEN(sDez1$)> LEN(sDez2$) THEN
sDez2$=RIGHT$(STRING$(LEN(sDez1$),"0")+sDez2$,LEN(sDez1$))
ELSE
sDez1$=RIGHT$(STRING$(LEN(sDez2$),"0")+sDez1$,LEN(sDez2$))
END IF

FOR i& = LEN(sDez1$) TO 1 STEP -1
bAdd? = VAL(MID$(sDez1$, i&, 1)) + VAL(MID$(sDez2$, i&, 1)) + bMerk?
sAdd$ = STR$(bAdd?)

MID$(sDez1$,i&,1)=RIGHT$(sAdd$,1)
bMerk?=VAL(MID$(sAdd$,-2,1))
NEXT i&

IF bMerk?>0 THEN sDez1$="1"+sDez1$
FUNCTION= sDez1$
END FUNCTION

'Multiplikation von zwei beliebig großen, positiven, ganzzahligen Dezimalzahlen
FUNCTION sMultiplikation(sDez1 AS STRING, sDez2 AS STRING) AS STRING
LOCAL i,i1 AS LONG
LOCAL bMult AS BYTE
LOCAL bMerk AS BYTE
LOCAL sMult AS STRING
LOCAL sErg AS STRING
LOCAL sMultErg AS STRING

sDez1$= RETAIN$(sDez1$, ANY "0123456789")
sDez2$= RETAIN$(sDez2$, ANY "0123456789")

FOR i& = LEN(sDez1$) TO 1 STEP -1
sErg$=STRING$(LEN(sDez1$)-i&,"0")
FOR i1& = LEN(sDez2$) TO 1 STEP -1
bMult? = VAL(MID$(sDez1$, i&, 1)) * VAL(MID$(sDez2$, i1&, 1)) + bMerk?
sMult$ = STR$(bMult?)

sErg$=RIGHT$(sMult$,1)+sErg$
bMerk?=VAL(MID$(sMult$,-2,1))
NEXT i1&
IF bMerk?>0 THEN
sErg$=RIGHT$(STR$(bMerk?),1)+sErg$
bMerk?=0
END IF
sMultErg$=sAddition(sMultErg$,sErg$)
NEXT i&

FUNCTION= sMultErg$
END FUNCTION

'Umrechnung einer beliebig großen HEX-Zahl in eine Dezimalzahl
FUNCTION sHexToDezimal(sHex AS STRING) AS STRING
LOCAL i AS LONG
LOCAL bMult AS BYTE
LOCAL sMult AS STRING
LOCAL sErg AS STRING

sHex$= UCASE$(sHex$)
sHex$= RETAIN$(sHex$, ANY "0123456789ABCDEF")

sMult$="1"
FOR i& = LEN(sHex$) TO 1 STEP -1
bMult?=VAL("&H0"+MID$(sHex$,i&,1))
sErg$=sAddition(sErg$,sMultiplikation(MID$(STR$(bMult?),2),sMult$))
sMult$= sMultiplikation(sMult$,"16")
NEXT i&

FUNCTION= sErg$
END FUNCTION


'und hier ein kurzer Test der Funktion
FUNCTION PBMAIN () AS LONG
LOCAL Test, SollDez AS STRING

'bei richtiger Berechnung sollte bei der Umwandlung von Test$
'als Ergebnis SollDez$ erscheinen
Test$="c4ca4238a0b923820dcc509a6f75849b"
SollDez$="261578874264819908609102035485573088411"

MSGBOX test$+$CRLF+sHexToDezimal(Test$)+$CRLF+SollDez$,,"Test HexToDezimal"

END FUNCTION



Extras: Beitrag drucken   Auf den Merkzettel   Moderator benachrichtigen  
Volker Butzlaff
Mitglied 50+

Registriert: 03.11.2003
Beiträge: 54
Wohnort: Stuttgart
Re: Rechnen mit wirklich großen Zahlen
      #2837 - 18.01.2010 19:34

Klasse, Herr Kirschbaum!

Der Toyota - Werbeslogan ist also auch für PowerBasic anwendbar:

"Nichts ist unmöglich - PowerBasic!!!"



Extras: Beitrag drucken   Auf den Merkzettel   Moderator benachrichtigen  
Volker Butzlaff
Mitglied 50+

Registriert: 03.11.2003
Beiträge: 54
Wohnort: Stuttgart
Re: Rechnen mit wirklich großen Zahlen neu
      #2888 - 22.03.2010 22:07

... eine interessante Bibliothek für ähnliche Probleme mit "grossen" Zahlen:
http://www.devotechs.com/

ciao,
Volker

Extras: Beitrag drucken   Auf den Merkzettel   Moderator benachrichtigen  
Seiten in diesem Thema: 1


Statistiken
0 registrierte Benutzer und 1 Besucher in diesem Forum.

Moderator:  Josef Kirschbaum 

Thema drucken

Rechte
      Sie können keine neuen Themen erstellen
      Sie können keine neuen Antworten erstellen
      HTML ist deaktiviert
      UBBCode ist aktiviert

Bewertung:
Thema gelesen: 794

Bewerten Sie dieses Thema
 
Sprung zu

Kontaktformular | Datenschutzerklärung zur PowerBASIC Startseite



UBB.threads™ 6.2.1