Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Konversion von dezimal zu binär (https://www.delphipraxis.net/168622-konversion-von-dezimal-zu-binaer.html)

Bjoerk 31. Mai 2012 23:57

AW: Konversion von dezimal zu binär
 
Außerdem ist k für 32 Digits > MaxInt :wink:

Amateurprofi 1. Jun 2012 01:29

AW: Konversion von dezimal zu binär
 
Zitat:

Zitat von idefix2 (Beitrag 1169011)
Das ist aber kein fair play: Du machst Dir die Tatsache zunutze, dass die Dezimalzahl intern ohnehin schon als Binärzahl konvertiert vorliegt. Du konvertierst nicht die Dezimalzahl in eine Binärzahl, sondern liest die bereits vorhandenen Bits der Binärdarstellung aus. Ich glaube nicht, dass das im Sinne des Aufgabenstellers ist.

Trotzdem geht es natürlich auch ohne die Power Funktion, man muss dazu nur die Zahl wiederholt durch zwei dividieren und die aufeinanderfolgenden Divisionsreste zu einem Binärzahlenstring zusammenhängen.

Das ist aber eine merkwürdige Argumentation.
Alle Daten ob Strings, Integers, oder Extended-Werte sind letztendlich binäre Daten.
Wenn jemand sein Wissen darüber nutzt, um zu einer Lösung zu kommen, dann ist das nicht unfair sondern vernünftig.

Der TE hatte ja seine "number" als Extended deklariert.

Die unten stehende Funktion nutzt die binäre Darstellung im Extended-Wert um ohne weitere Umwege den Extended in einen Binärstring umzuwandeln.
Sie ist für Werte von 0 bis 2^64-1 ausgelegt.
Bei Werten außerhalb dieses Bereiches wird eine Exception ausgelöst.

Ich hab die Funktion "auf die schnelle" geschrieben und nicht wirklich voll ausgetestet. Bitte keine Schimpfe wenn da Bugs drin sind.
Delphi-Quellcode:
FUNCTION ExtendedToBin(const v:extended):string;
type
   TExt=packed record M:UInt64; E:word; end;
const
   Bias=$3FFF; Sign=$8000; MaxE=Bias+63;
   sErr='Fehler bei Umwandlung in Binärstring.';
var
   e:word; i:integer;
begin
   e:=TExt(v).E;
   if e>0 then begin
      if (e>=Sign) or (e<Bias) or (e>MaxE) then raise Exception.Create(sErr);
      dec(e,Bias);
      if (e<63) and (((UInt64(1) shl (63-e) - 1) and TExt(v).M)<>0) then
         raise Exception.Create(sErr);
   end;
   SetLength(result,e+1);
   for i:=1 to e+1 do
      result[i]:=Chr($30 or Ord(TExt(v).m and (UInt64(1) shl (64-i))<>0));
end;

Luckie 1. Jun 2012 03:12

AW: Konversion von dezimal zu binär
 
Zitat:

Zitat von diavy (Beitrag 1168937)
Vorneweg, ich habe delphi 6, da war die math.pas nicht dabei.

Aber die dcu musst dabei sein und mehr brauchst du nicht.

Zitat:

da die Funktion n^i nicht funktionniert hat
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. :roll:

Popov 1. Jun 2012 04:06

AW: Konversion von dezimal zu binär
 
Zitat:

Zitat von idefix2 (Beitrag 1169011)
Das ist aber kein fair play: Du machst Dir die Tatsache zunutze, dass die Dezimalzahl intern ohnehin schon als Binärzahl konvertiert vorliegt.

Was hat das mit Fair Play zu tun? Selbst wenn die Zahl als Banane vorliegt und uns die braunen Flecken den Binärwert verraten, dann ist es eben so. Das einzige was ich gelesen habe ist, dass er es konvertieren will. Wenn er das über Wuppertal konvertieren will, dann soll er es vorher sagen.

Amateurprofi 1. Jun 2012 04:10

AW: Konversion von dezimal zu binär
 
Zitat:

Zitat von himitsu (Beitrag 1168961)
Und wegen dem "kompliziert":
Können sich auch ein paar Nachteile (Rechenfehler) ergeben, wenn man "Binäroperationen" (Auslesen der Bits für einen "Integer") über Fließkommazahlen und -Fließkommaperationen abwickelt (Extended), wo es diese gewünschten "Bits" so eigentlich nicht gibt.

Oh, doch, die gibt es.

Furtbichler 1. Jun 2012 06:30

AW: Konversion von dezimal zu binär
 
Zitat:

Zitat von Amateurprofi (Beitrag 1169024)
Zitat:

Zitat von himitsu (Beitrag 1168961)
wo es diese gewünschten "Bits" so eigentlich nicht gibt.

Oh, doch, die gibt es.

"So" gibt es sie "eigentlich" nicht.
Sie existieren nur in der Phantasie der floating Points, wobei sich die Funktion 'Power' Mühe gibt, ihre Phantasiebits für sich zu behalten.

Und wir müssen doch wohl nicht ernsthaft über floating point, Rundungsfehler etc. diskutieren, oder? Du weisst Doch genau, wie himitsu es meinte.

Amateurprofi 1. Jun 2012 10:53

AW: Konversion von dezimal zu binär
 
Zitat:

Zitat von Furtbichler (Beitrag 1169030)
Zitat:

Zitat von Amateurprofi (Beitrag 1169024)
Zitat:

Zitat von himitsu (Beitrag 1168961)
wo es diese gewünschten "Bits" so eigentlich nicht gibt.

Oh, doch, die gibt es.

"So" gibt es sie "eigentlich" nicht.
Sie existieren nur in der Phantasie der floating Points, wobei sich die Funktion 'Power' Mühe gibt, ihre Phantasiebits für sich zu behalten.

Und wir müssen doch wohl nicht ernsthaft über floating point, Rundungsfehler etc. diskutieren, oder? Du weisst Doch genau, wie himitsu es meinte.

Mag, sein, dass sie bei dir nur in der Phantasie existieren.
Bei mir ist ihre Existenz sehr real.
Wenn du dir mal die Mühe gemacht hättest den Code #12 anzusehen, dann wüßtest du, dass man auf die Bits eines Extendeds (wenn er im Bereich -2^64+1 bis 2^64-1 liegt) genau so einfach zugreifen läßt wie auf die eines Integers.
Wenn also jemand meint, beim Extended existieren diese Bits nur in der Phantasie, dann muss er eigentlich auch meinen, dass bei einem Integer die Bits nur in der Phantasie existieren.

Und zum "Und wir müssen doch wohl nicht ernsthaft über floating point, Rundungsfehler etc. diskutieren, oder?"
Ich habe mit keinem Wort Rundungsfehler angesprochen. Was soll also dieser Kommentar.

Iwo Asnet 1. Jun 2012 13:03

AW: Konversion von dezimal zu binär
 
Ich glaube, alle haben aneinander vorbeigeredet. Nimms nicht so schwer, es ist Freitag.

Du konvertierst über Extended (Floating Point!!!1!!11!) jemand schmeisst ein "Power(x,y)" da mit rein ("Rundungsfehler!!1!!Elf!!") und dann kommen die üblichen Automatismen.

Ach, und braune Flecken auf Bananen waren auch dabei. Allerdings kommentarlos.

Interessant, das Ganze.

idefix2 1. Jun 2012 14:48

AW: Konversion von dezimal zu binär
 
Zitat:

Was hat das mit Fair Play zu tun? Selbst wenn die Zahl als Banane vorliegt und uns die braunen Flecken den Binärwert verraten, dann ist es eben so. Das einzige was ich gelesen habe ist, dass er es konvertieren will. Wenn er das über Wuppertal konvertieren will, dann soll er es vorher sagen.
Zitat:

Alle Daten ob Strings, Integers, oder Extended-Werte sind letztendlich binäre Daten.
Wenn jemand sein Wissen darüber nutzt, um zu einer Lösung zu kommen, dann ist das nicht unfair sondern vernünftig.
Daten im Computer werden "zufällig" binär abgespeichert. Ein mathematischer Algorithmus zur Konversion einer Zahl von einem Zahlensystem in ein anderes hat aber mit der zufällig binären Zahlendarstellung im Speicher des Computers nichts zu tun. Wenn es im Internet zufällig eine Seite mit einer Tabelle der Binärdarstellung aller ganzen Zahlen zwischen 0 und 2^32 gäbe, dann könnte man auch ein Programm schreiben, das die Internetseite aufruft und den entsprechenden String auf der Seite findet. Oder man könnte eine array Konstante deklarieren, die für jede zahl den entsprechenden String enthält (das wäre eine Menge Schreibarbeit, aber auch theoretisch möglich). Dann würden diese Programme auch die richtige Binärdarstellung liefern, aber das wäre eben auch kein Konversionsalgorithmus, der vom Lehrer gefordert wurde.

diavy 1. Jun 2012 16:54

AW: Konversion von dezimal zu binär
 
Also vorneweg danke für die alternative Lösung aber ich wär ganz froh wenn ich das Programm mit meiner ursprünglichen Idee ans Laufen bekommen würde.

Habe mir den Ratschlag dass der array zu klein ist zu Herz genommen und micht über SetLength informiert (und es eingebaut). Klappen tut es immer noch nicht.

Delphi-Quellcode:
program ex69;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  math;

var
number:extended;
i,k:integer;
square:array of integer;

begin
  { TODO -oUser -cConsole Main : Insert code here }
{$Q+}
{$R+}
readln(number);
i:=0;
while number>power(2,i) do
        inc(i);
k:=i;
setlength(square,k);
while (number<>0) do
        begin
        while number>power(2,i) do
                inc(i);
        i:=i-1;
        number:=(number-(power(2,i)));
        square[i]:=1;
        end;
for i:=k downto 0 do
        writeln(square[i]);
readln;
end.
--> Debugger Exception Notification: Project ex69.exe raised exception class ErangeError with message 'Range check error'. Process stopped. Use Step or Run to continue.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz