Delphi Eigene Fkt. Integer -> Binär funktioniert nicht, wo ist der Fehler?

kein pc wissen

Cadet 4th Year
Registriert
Feb. 2008
Beiträge
90
Hallo

Ich habe in Delphi eine Funktion geschrieben, die Integer-Zahlen in Binärzahlen umrechnet. Mein erster Versuch die Ausgabewerte als Real heraus zu geben scheiterte daran, dass Werte ab einer gewissen Größe nur noch mit *10^x herausgegeben wurden. Mein neuer Versuch war deshalb, die Ausgabewerte als String zu verwenden.

Die Funktion sieht so aus: (Uses Math muss hinzugefügt werden)

Code:
function IntToBin(Input:integer):string;
var
  i:integer;
  min:integer;
  max:integer;
begin
  max:=round((ln(Input)/(ln(2))));
  for i:=max downto 0 do
  begin
    if (Input >= (power(2,max))) and (Input < (2*(power(2,max)))) then
    begin
      result:=result+'1';
    end
    else
    begin
      result:=result+'0';
    end;
    Input:=Input-round(power(2,max));
  end;
end;

Die Probleme, die es bei der Fkt. gibt sind folgende:
  • Wenn Input=0 ist das Programm kaputt
  • Die Zahlen 1 und 2 sind mit die einzigen, die richtig umgewandelt werden
  • Andere Zahlen werden mit einer Reihe '0000' angezeigt

Wo kann der Fehler in der Fkt. liegen?

Um Antwort wird gebeten
 
http://delphiportal.de/348-dezimal-nach-binar
Dein Problem mit 0 als Input dürfte im Übrigen am ln von 0 liegen welcher undefiniert ist...müsstest du ne Sonderbehandlung machen. Abgesehen davon check ich ned ganz was du da kompliziert rumrechnest...
Im Übrigen solltest du der Sauberkeit halber auch result mit nem leeren Wert initialisieren.
 
Zuletzt bearbeitet:
Die Fkt auf der Internetseite ist gut, praktisch so etwas wie ich machen wollte nur einfacher.

Ich kannte nur einige der Befehle (repeat;until) nicht, weshalb ich versuchte die Fkt mit befehlen, die mir bekannt sind zu erstellen.

Kann mir trotzdem jemand sagen, wo die Fehler in meiner Fkt sind, damit mir meine Fehler klar werden.

BerniG:"Dein Problem mit 0 als Input dürfte im Übrigen am ln von 0 liegen welcher undefiniert ist...müsstest du ne Sonderbehandlung machen. Abgesehen davon check ich ned ganz was du da kompliziert rumrechnest...
Im Übrigen solltest du der Sauberkeit halber auch result mit nem leeren Wert initialisieren. "

Ich habe mal diese Fehler behoben, jetzt ist zwar das Problem mit 0 behoben, zeigt aber sonst noch die oberen Fehler


Code:
uses math;

function IntToBin(Input:integer):string;
var
  i:integer;
  max:integer;
begin
  result:='';
  if Input <1 then result:='0'
  else
  begin
     max:=round((ln(Input)/(ln(2))));
     for i:=max downto 0 do
     begin
       if (Input >= (power(2,max))) and (Input < (2*(power(2,max)))) then
       begin
         result:=result+'1';
       end
       else
       begin
         result:=result+'0';
       end;
       Input:=Input-round(power(2,max));
     end;
   end;
end;

So sieht der Code momentan aus.
 
Die Berechnung im verlinkten Beispiel ist halt so wie man es eigtl. in jedem Informatikkurs lernt und auch auf Papier anwenden kann. Siehe auch z.B. http://www.rolandgeyer.at/kurse/german/asssrc/asse005.html .

Bei dir haperts da also eher an der mathematischen Umsetzung. Das ist halt einfach falsch wenn du in jedem Schritt dasselbe (power(2,max) ist immer dasselbe weil max sich ja gar nicht ändert!) abziehst und ich verstehe auch gar nicht was du mit dem Wert überhaupt willst. Wo hast du das denn her?
 
Zurück
Oben