Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dec to Hex (https://www.delphipraxis.net/118589-dec-hex.html)

rich123 11. Aug 2008 08:46


Dec to Hex
 
Hallo,

Ich suche eine Delphi Funktion die einen Dezimal Wert nach Hex wandelt. (Mit Nachkommastellen!!)

Da kann mir InttoHex leider nicht helfen.

Danke

toms 11. Aug 2008 08:53

Re: Dec to Hex
 
Hallo, meinst du FloatToHex?

rich123 11. Aug 2008 09:00

Re: Dec to Hex
 
Hallo,

Ich benutze auch Delphi 7 aber die Funktion wird nichtgefunden.
Brauche ich eine bestimmte Bibliothek?

Danke schonmal

Sherlock 11. Aug 2008 09:05

Re: Dec to Hex
 
Ist nicht Dein Ernst, oder? ;)

Steht doch alles im Link.

Sherlock

Panthrax 11. Aug 2008 09:06

Re: Dec to Hex
 
Vielleicht so in etwa? (schnell reingehämmert, ungetestet:)
Delphi-Quellcode:
Result:=IntToHex(Trunc(X))+','+IntToHex(Round(Trunc((X-Trunc(X))*Power(10,Y)))); // N = Anzahl Nachkommastallen
FloatToHex müsstest du dir von der Internetseite kopieren. Das ist nämlich nur ein Vorschlag es in die RTL zu integrieren. Aber wozu braucht man das überhaupt? :gruebel:

rich123 11. Aug 2008 09:10

Re: Dec to Hex
 
ja war mein fehler, hab die funktion aus dem Link nun auch probiert, aber die liefert mir ziemlich falsche Werte. Funktioniert die bei euch?

Panthrax 11. Aug 2008 09:16

Re: Dec to Hex
 
Ja, sie funktioniert. Aber bist du dir sicher, dass du verstehst wie sie funktioniert?

rich123 11. Aug 2008 09:19

Re: Dec to Hex
 
Eher nicht, könntest du sie vielleicht kurz erklären?

toms 11. Aug 2008 09:21

Re: Dec to Hex
 
Delphi-Quellcode:
Label1.Caption := FloatToHex(123.344)

Delphi-Quellcode:
function FloatToHex(const x: double): string;
type
  tBA = array [0..SizeOf(x)-1] of byte;
var
  Buf: tBA; i: integer;
begin
  For i := 0 to high(tBA)
    do Buf[high(tBA)-i] := tBA(x)[i];
  If (Buf[0] and $80) = 0  {Modif 2007-08-18 by JFH}
    then Buf[0] := Buf[0] xor $80
    else for i := 0 to high(tBA) do Buf[i] := not Buf[i];
  SetLength(Result,SizeOf(Buf)*2);
  BinToHex(@Buf,PChar(Result),SizeOf(Buf));
end;

rich123 11. Aug 2008 09:29

Re: Dec to Hex
 
Hallo toms,

Genau das habe ich auch probiert und dann kommt als Lösung

C05ED604189374BC

Wenn ich das in den Windows Rechner schmeisse liefert der mir eine enorm hohe Zahl.
Ich denke ich mache da was mit dem Komma falsch.

oder?

Panthrax 11. Aug 2008 09:30

Re: Dec to Hex
 
Ich vermute, du suchst eher soetwas:
Delphi-Quellcode:
uses
  SysUtils, Math;

function FloatToHex(const X: Double; const Digits, N: Integer): String;
begin
  Result:=IntToHex(Trunc(X),Digits)+','+IntToHex(Round((X-Trunc(X))*Power(10,N)),N);
end;
Die FloatToHex-Routine aus dem Vorschlag oben ist eher geeignet eine Gleitkommazahl eben nicht im Binär-, sondern im Textformat mit Hexzeichen zu speichern. Als Mensch ist man beim Lesen aber nicht schlauer. Und ehrlich, gesagt frage ich mich immernoch wozu man sowohl das eine oder noch andere braucht...

Panthrax 11. Aug 2008 09:33

Re: Dec to Hex
 
Zitat:

Zitat von rich123
Wenn ich das in den Windows Rechner schmeisse liefert der mir eine enorm hohe Zahl.
Ich denke ich mache da was mit dem Komma falsch.

oder?

Gib doch bitte mal beim Windows-Taschenrechner eine Zahl mit Nachkommastelle <> 0 ein. Schalte von Dez auf Hex und zurück. Und gucke dann, ob deine Nachkommastellen noch vorhanden sind. - Tadaaa! Der Windows-Taschenrechner ignoriert sie einfach... Deshalb könen sie beim Zurückschalten nicht wiederhergestellt werden. So jetzt aber genug zum Thema, weil ich immernoch nicht begriffen haben, wozu man soetwas braucht...

marabu 11. Aug 2008 09:36

Re: Dec to Hex
 
Hallo,

den Namen FloatToHex() hat John Herbster etwas unglücklich gewählt - finde ich. Er liefert einfach eine sortierfähige Hex-Darstellung eines Float-Wertes, gesucht wird hier aber wohl ein Analogon zu FloatToStr(), wobei die Ausgabe zur Basis 16 anstelle zu Basis 10 erfolgen soll.

Delphi-Quellcode:
function FracToHex(value: Double): string;
const
  HEX_DIGIT = '0123456789ABCDEF';
begin
  Result := '';
  repeat
    value := Frac(value) * 16;
    Result := Result + HEX_DIGIT[Succ(Trunc(value))];
  until IsZero(value);
end;

function FloatToHex(d: Double): string;
begin
  Result := Format('%x%s%s', [Trunc(d), DecimalSeparator, FracToHex(d)]);
end;
Grüße vom marabu

Sherlock 11. Aug 2008 09:53

Re: Dec to Hex
 
Nach welcher Norm werden denn hier die Gleitkommazahlen umgewandelt? Ist das IEE?
Sieht für mich eigentlich nicht unbedingt so aus.

Wozu soll das dann gut sein?

Edit: Und hier noch geschwind ein Link zum Thema IEE http://de.wikipedia.org/wiki/Gleitko..._andere_Normen
Da in dem Artikel ein Algorithmus gezeigt, wird, wie die Umwandlung stattfindet, ist das ja auch ein brauchbarer Ansatz die Sache richtig zu machen.

Sherlock

marabu 11. Aug 2008 10:05

Re: Dec to Hex
 
Hallo Sherlock,

deine Fragen richten sich wohl nicht an mich, sonst hättest du mich bestimmt adressiert. Trotzdem eine Bemerkung von mir: Es geht hier um ein mathematisches Problem. Die Umsetzung mathematischer Gesetze in der Digitaltechnik und ihre Normung durch das IEEE spielen da nur am Rande eine Rolle. Speziell die Konvertierung zwischen Zahlsystemen lässt sich mit Stift und Papier nach Regeln durchführen, die älter als das IEEE sind.

Freundliche Grüße

Sherlock 11. Aug 2008 10:08

Re: Dec to Hex
 
Hallo Marabu,

richtig, ich habe Dich nicht angesprochen :)
Ich wollte halt hören, wie die Hausaufgabe genauer formuliert ist. ;)

Sherlock

marabu 11. Aug 2008 10:16

Re: Dec to Hex
 
An eine Hausaufgabe als mögliche Motivation für diesen Thread habe ich nicht gedacht.

Nur gut, dass ich die Vorzeichenbehandlung weggelassen habe.

Reinhard Kern 11. Aug 2008 10:28

Re: Dec to Hex
 
Zitat:

Zitat von marabu
... Die Umsetzung mathematischer Gesetze in der Digitaltechnik und ihre Normung durch das IEEE spielen da nur am Rande eine Rolle. Speziell die Konvertierung zwischen Zahlsystemen lässt sich mit Stift und Papier nach Regeln durchführen, die älter als das IEEE sind.

Freundliche Grüße

Hallo,

logisch, die mathemathischen Gesetze sind ewigwährend, auch die, die der Mensch noch nicht gefunden hat - diese tiefgreifende Erkenntnis hilft aber beim Programmieren garnicht weiter.

Falls man mit einer umgewandelten Zahl noch irgendetwas Sinnvolles anfangen will, ist es schon sehr hilfreich, Normen zu beachten, eine Zahl in Gleitkommadarstellung kann eben nur wieder gelesen werden, wenn man den Aufbau von Vorzeichen, Exponent und Mantisse kennt. Auch die verschiedenen manuellen Schreibweisen sind nur vereinbarte Kodierungen (und nicht die "Zahl selbst", wers nicht glaubt, soll Pi hinschreiben).

Gruss Reinhard

marabu 11. Aug 2008 10:54

Re: Dec to Hex
 
Hallo Reinhard,

Zitat:

Zitat von Reinhard Kern
... logisch, die mathemathischen Gesetze sind ewigwährend, auch die, die der Mensch noch nicht gefunden hat - diese tiefgreifende Erkenntnis hilft aber beim Programmieren garnicht weiter. ...

da es hier nach meiner Einschätzung lediglich um die Konvertierung von Darstellungen 12.5 (10) --> C.8 (16) geht, werden Kenntnisse über die interne Repräsentation von Gleitkommazahlen wirklich nicht benötigt. Mit anderen Worten hatte ich das ja bereits geschrieben, aber mitunter ist eine Umformulierung ja ganz hilfreich. Warten wir mal ab, was der thread owner noch zur Erhellung beiträgt.

Freundliche Grüße

rich123 11. Aug 2008 11:36

Re: Dec to Hex
 
Hallo,

Ähh ich erkläre mal kurz wozu die Umrechnung.
Und zwar lese ich aus einer Excel-Tabelle Werte aus und gebe die über Ethernet-Schnittstelle an ein Gerät weiter. Die Funktion (die nicht ich geschrieben habe) um Werte an das Gerät zu senden, nimmt nur HEX Werte an.

Panthrax 11. Aug 2008 11:43

Re: Dec to Hex
 
Mit Komma? Was sagt denn die Dokumentation zur Funktion wie diese Hex-Wert aussehen müssen!?

rich123 11. Aug 2008 11:51

Re: Dec to Hex
 
Zum Beispiel:

$020003BA

Sherlock 11. Aug 2008 12:01

Re: Dec to Hex
 
Zitat:

Zitat von rich123
Zum Beispiel:

$020003BA

Und welcher Dezimalwert soll das sein?

Sherlock

rich123 11. Aug 2008 12:03

Re: Dec to Hex
 
Zitat:

Und welcher Dezimalwert soll das sein?

Sherlock
Das wäre 954, sollte dazu noch erklären, dass die letzten Stellen der Wert sind, die vorne ist nur für eine Addresse

Sherlock 11. Aug 2008 12:12

Re: Dec to Hex
 
Menno, zeig doch bitte ein Beispiel mit Nachkommastellen :D

Sherlock

rich123 11. Aug 2008 12:19

Re: Dec to Hex
 
Also hier habe ich ein Beispiel:

115.3 in Dezimal
ergibt
73,4CC in HEX

http://www.arndt-bruenner.de/mathe/s...lensysteme.htm

Hier wäre so ein Onlinerechner der das kann

Panthrax 11. Aug 2008 12:36

Re: Dec to Hex
 
Mesch, da wird doch alles erklärt... Es gibt vielleicht keine vorgefertigte Funktion, aber die Internetseite erklärt doch wirklich alle Details. Dann schreib' dir doch eine Funktion FloatToHex, welche die genannten Schritte implementiert. Da ist wirklich keine große Mystik dabei.

Sherlock 11. Aug 2008 12:48

Re: Dec to Hex
 
rich123, die Frage ist doch aber, ob diese Repräsentation einer Gleitkommazahl auch wirklich dem entspricht, was die Gegenstelle erwartet. Ist das so?

Sherlock

rich123 11. Aug 2008 16:54

Re: Dec to Hex
 
Hallo zusammen,

Erstmal will ich mich bei allen bedanken.
Ich habe das jetzt auf eine andere Art und Weise gelöst. Und zwar Runde ich die Float Zahl und danach mach ich eine Int daraus.
Dann gehts ganz einfach mit der InttoHex.

Das ist in meinem Fall genau genug.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 Uhr.

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