PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VBA - Satz von Legendre


sYnapSe
2011-01-05, 12:36:58
Hallo liebe User,

für mein Studienprojekt, soll mit Hilfe des Satzes von Legendre, die Quersumme einer zuvor berechneten Binärzahl berechnet werden. Leider ist dieser Weg vorgeschrieben, weshalb es sich für mich nicht einfach gestaltet, herauszufinden, weshalb mir ab einem gewissen Wert nur noch falsche Zahlen ausgerechnet werden. Aus diesem Grund wende ich mich an euch.

Die Formel lautet wie folgt:

QuerSummeBin := n - (k - 1) * http://img145.imageshack.us/img145/2426/unbenannt2ae.jpg


Es handelt sich um folgenden Code:


Public Function QuerSummeBin(DezZuBin As String) As Variant
Dim i As Integer
Dim n As Variant
Dim k As Integer
Dim Summe As Variant
Dim Schleife As Variant


n = Val(DezZuBin)
Summe = 0
i = 1
k = 10

Do

Summe = Fix(n / k ^ i)
Schleife = Schleife + Summe

i = i + 1

Loop Until Summe = 0



QuerSummeBin = n - (k - 1) * Schleife
End Function


Zur Erklärung: DezZuBin ist hier der Binärcode, welcher in einer vorherigen Function bereits berechnet und als String übergeben wurde. Hierbei handelt es sich also ausschließlich um 0 und 1.
Der Rest müsste eigentlich aus dem Code schon ersichtlich sein.

Wie schon kurz angedeutet, ist der Ausgabewert bei 17 Stellen des Binärwertes richtig. Alles darüber ergibt wirre Werte.
Hat jemand vielleicht eine Idee woran das liegen könnte? In Excel kann man ja Variablen in die Überwachung hinzufügen. Meiner Meinung nach, werden alle Rechnungen in der Schleife korrekt ausgeführt. Erst am Schluss entsteht dieser seltsame Wert.

Mit freundlichem Gruß!

Sephiroth
2011-01-05, 14:38:03
Wenn DezZuBin eine Binärdarstellung sein soll, dann ergibt Val(DezZuBin) den gleichen Ausdruck als Dezimalzahl. Es findet dabei keine korrekte Umwandlung von Binär zu Dezimal statt!

also 1010 (bin) wird zu 1010 (dez)

Dadurch wird am Ende vermutlich der Wert für QuerSummeBin zu groß für den Datentyp Variant. Den größten numerischen Datentyp den VBA anzubieten hat, ist Long mit Wertebereich von -2147483648 bis 2147483647.

Gast
2011-01-05, 14:48:19
Du musst schon richtig klammern. Aus



Summe = Fix(n / k ^ i)



wird


Summe = Fix(n / (k ^ i))


und aus



QuerSummeBin = n - (k - 1) * Schleife



wird


QuerSummeBin = n - ((k - 1) * Schleife)

sYnapSe
2011-01-05, 15:35:13
Danke für die fixen Antworten!
@Sephiroth: Genau das war der größte Fehler! Habe ihn behoben nun funktioniert es.

Vielen Dank euch beiden!

huha
2011-01-05, 15:40:42
Es empfiehlt sich übrigens, Variablen sinnvoll zu benennen und die Programmstruktur durch Einrückung zu visualisieren.

-huha