Nachkommastellen mit Modulo -> Binärzahlen?
-
Hallo,
wenn man eine Division a/b durchführt, dann werden die Nachkommastellen ja mit den Resten berechnet. Um einen Algorithmus für den PC zu programmieren, müsste man also den Modulo einsetzen, was man ja sonst quasi im Kopf macht.
Ich hoffe ihr verzeiht, dass das jetzt Visual Basic-Code ist, aber es geht ja im Grunde um den Algorithmus. Der Code wäre problemlos auf C++ umzuschreiben.
Also ich habe mir die Funktion geschrieben:
Public Function n(ByVal a As Double, ByVal b As Double, Optional ByVal Ziffern As Double = 10) Dim sDelimiter As String = "." Dim sRes As String = "" If a < b Then sRes += "0" & sDelimiter If a Mod b = 0 Then Return a / b If a > b Then sRes += "" & (a - a Mod b) / b & sDelimiter a = a Mod b If a = 0 Then Return sRes End If For i = 1 To Ziffern Dim nz As Double = 0 While a < b a *= 10 //HIER HIER HIER nz += 1 End While If nz > 1 Then For j = 2 To nz sRes += "0" Next End If sRes += "" & (a - a Mod b) / b a = a Mod b If a = 0 Then Exit For Next i Return sRes End Function
Eigentlich macht sie nichts weiter, als das, was wir bei der Division im Kopf machen. Funktioniert auch wunderbar. Jetzt zur Frage: Wenn ich bei der Zeile mit "//HIER HIER HIER" statt "a *= 10" "a *= 2" schreibe, dann bekomme ich ein Ergebnis ausschließlich aus Nullen und Einsen. Sind das die richtigen Binärzahlen, oder ist das nur Zufall?
Danke,
Grüße,
Thilo
-
Könntest du den Code bitte mal verständlich schreiben? Variablennamen mit weniger als 3 Zeichen sind ziemlich unzugänglich bei fremden Code.
Wenn ich es richtig entziffert habe, dann: Nein, das sind zwar konstruktionsbedingt nur Nullen und Einsen, aber das Ergebnis stimmt nicht. Warum überprüfst du es nicht einfach, wenn du schon ein Programm hast? Ein Gegenbeispiel sollte sich schnell finden. Falls du Schwierigkeiten mit dem Ausrechnen von Binärbrüchen im Kopf/Papier hast, dann findest du hier ein paar einfache Ergebnisse:
http://en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary(P.S.: Falls die Ergebnisse sich entgegen meiner Analyse doch als richtig herausstellen sollten, dann schreib das bitte. Dann muss ich mal tiefer in den Code einsteigen, was du da wirklich treibst)
-
Doch, es stimmt Lustiger Zufall. Das hatte ich gar nicht vor, zu programmieren