Umwandlung float in einen Hexstring

Anfängerfragen zum Programmieren mit PureBasic.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Umwandlung float in einen Hexstring

Beitrag von DarkDragon »

AND51 hat geschrieben:
Und am besten gleich einen Binärstring einer Floatzahl hinzufügen, mit Formeln zum zurückwandeln
Natürlich kann man Floatzahlen aus unserem Dezimalsystem in das Binärsystem und damit auch in jedes andere System umwandeln.
Das geht mit dem Horner-Schema.
Mit dem Horner Schema hab ich bisher nur die Polynomdivision umgehen können (Wir haben in der Schule explizit nur Horner Schema durchgenommen weil der Lehrer meinte Polynomdivision braucht niemand wenn er das Horner Schema kann), aber wie man da in andere Zahlensysteme umwandelt weiß ich noch nicht.
Zuletzt geändert von DarkDragon am 04.10.2009 09:46, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Umwandlung float in einen Hexstring

Beitrag von ts-soft »

@Thorium

Mag ja sein das man den Wert berechnen kann, aber ein Hexstring ist es nicht.
Woran soll man erkennen, das es 32-Bit und Floatingpoint ist?

Netter Rechner :allright:
korrekte Schreibweise eines 32-Bit Floatingpoint Hexstrings suche ich immer
noch :mrgreen:
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Umwandlung float in einen Hexstring

Beitrag von Thorium »

ts-soft hat geschrieben:@Thorium

Mag ja sein das man den Wert berechnen kann, aber ein Hexstring ist es nicht.
Woran soll man erkennen, das es 32-Bit und Floatingpoint ist?

Netter Rechner :allright:
korrekte Schreibweise eines 32-Bit Floatingpoint Hexstrings suche ich immer
noch :mrgreen:
Klar ist es ein Hexstring, kodiert nach IEEE-754.
Erkennen tut man nicht, man weis. Es ist immer eine Interpretationsfrage.

Du würdest ja auch nicht anzweifeln das 1056 ein hexadezimaler String ist, wenn ich das sagen würden. Erkennen kann man es nicht, man muss es einfach wissen. Man kann Daten halt unterschiedlich interpretieren. Die Zahl könnte hexadezimal sein, oder dezimal, oder sogar octal. Reine Interpretationssache.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Umwandlung float in einen Hexstring

Beitrag von ts-soft »

> Erkennen tut man nicht, man weis. Es ist immer eine Interpretationsfrage.
Es gibt keine allgemeingültige Regel für die Darstellung von
Fließkommazahlen mit Hexadezimalzahlen, d.h. es gibt, anders als bei der
Fließkommadarstellung von Dezimalzahlen, keine Regel für die Darstellung
der Trennung von 'Vorkomma-' und 'Nachkomma'-Stellen. Das Komma dürfte hier
nicht verwendet werden, da sonst z.B. dezimales '1.1' und hexadezimales '1.1'
nicht zu unterscheiden sind - es sei denn, es wird ein Präfix oder Suffix verwendet,
das den hexadezimalen Wert als solchen kennzeichnet. Aber auch dafür gibt es keine
allgemeingültige Regel, es gibt nur in bestimmten, relativ beschränkten
Bereichen (Computer) gewisse Konventionen ('$...', '...$', 'x...', '0x...',
'...h', '&H...').
Also ist die Umwandlung in Hexstrings nicht möglich, lediglich in Hexwerte :mrgreen:

Warum glaubt mir keiner :lol:
Little John

Re: Umwandlung float in einen Hexstring

Beitrag von Little John »

Langstein hat geschrieben:ich möchte eine Floatzahl (z.B. 72.0) in einen Hexstring z.B. X'42900000' umwandeln.
Thorium hat geschrieben:Er hat sich nur etwas unglücklich ausgedrückt. Natürlich ist das keine Kommazahl, es ist ein Hexstring der Binärdaten des Floats. So wie wenn du den Float in eine Datei speicherst und dir die Datei dann mit nem Hexeditor anschaust.
Ich glaube auch, dass der OP das so gemeint hat. Er hätte besser geschrieben: "Ich möchte den Hexdump des Speicherbereiches, in dem sich eine bestimmte Fließkommazahl befindet." o.Ä. Dann wäre die Verwirrung geringer gewesen. :-)

Gruß, Little John
Little John

Re: Umwandlung float in einen Hexstring

Beitrag von Little John »

Thomas, woher stammt denn dieses Zitat?
Das Komma dürfte hier nicht verwendet werden, da sonst z.B. dezimales '1.1' und hexadezimales '1.1' nicht zu unterscheiden sind - es sei denn, es wird ein Präfix oder Suffix verwendet, das den hexadezimalen Wert als solchen kennzeichnet.
Jo hauaha! Das ist das schönste Nonsense-Argument, das ich seit langem gelesen habe. :-)
Tatsächlich ist auch z.B. das dezimale '21' ohne Präfix oder Suffix nicht vom hexadezimalen '21' zu unterscheiden. Das wird wohl der Grund sein, weshalb man sowas eben mit Prä- oder Suffix schreibt ... Aus ganz ähnlichen Gründen schreibt man übrigens manchmal auch nicht einfach nur '7', sondern '7 kg', '7 m', '7 EUR' oder sonstwas, je nachdem was man meint. :D

Gruß, Little John
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Re: Umwandlung float in einen Hexstring

Beitrag von Froggerprogger »

...was für eine Diskussion ;)

@Langstein:
Dein geposteter Code ist

Code: Alles auswählen

Structure my_data
StructureUnion
  byte.c[3];0...3
  real_value.f
EndStructureUnion
EndStructure

Dim m.my_data(0)

m(0)\real_value = 72.0
Debug m(0)
Das Debug m(0) gibt nur den Pointer auf den Datensatz m(0) aus, nicht aber die entsprechenden Bytes, wie anscheinend von Dir gewünscht. Dazu nimm Debug m(0)\byte[0]...Debug m(0)\byte[3], oder die von Thorium gepostete Antwort mittels Hex(PeekL(...)), oder den (mit deinem fast identischen) Ansatz von Kaeru mittels StructureUnion, aber diesmal nicht einzlne Bytes, sondern ein Long.

All die Lösungen geben (wie hier wild diskutiert) die Bits des Floats in seiner Standard-Fließkommadarstellung wieder. Dabei ist das erste Bit das Vorzeichen, dann folgen binäre Codierungen des Exponenten und der Mantisse. Diese lassen sich natürlich auch als Hexwerte darstellen. Dies ist allerdings (offensichtlich) was anderes, als die Zahl im Hexadezimalsystem darzustellen. Also je nachdem, was Du erreichen möchtest, kennst Du nun bereits 3 Lösungen, oder noch keine :)
!UD2
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Umwandlung float in einen Hexstring

Beitrag von Fluid Byte »

:lurk:
Windows 10 Pro, 64-Bit / Outtakes | Derek
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Umwandlung float in einen Hexstring

Beitrag von DarkDragon »

Froggerprogger hat geschrieben:...was für eine Diskussion ;)

@Langstein:
Dein geposteter Code ist

Code: Alles auswählen

Structure my_data
StructureUnion
  byte.c[3];0...3
  real_value.f
EndStructureUnion
EndStructure

Dim m.my_data(0)

m(0)\real_value = 72.0
Debug m(0)
Das Debug m(0) gibt nur den Pointer auf den Datensatz m(0) aus, nicht aber die entsprechenden Bytes, wie anscheinend von Dir gewünscht. Dazu nimm Debug m(0)\byte[0]...Debug m(0)\byte[3], oder die von Thorium gepostete Antwort mittels Hex(PeekL(...)), oder den (mit deinem fast identischen) Ansatz von Kaeru mittels StructureUnion, aber diesmal nicht einzlne Bytes, sondern ein Long.

All die Lösungen geben (wie hier wild diskutiert) die Bits des Floats in seiner Standard-Fließkommadarstellung wieder. Dabei ist das erste Bit das Vorzeichen, dann folgen binäre Codierungen des Exponenten und der Mantisse. Diese lassen sich natürlich auch als Hexwerte darstellen. Dies ist allerdings (offensichtlich) was anderes, als die Zahl im Hexadezimalsystem darzustellen. Also je nachdem, was Du erreichen möchtest, kennst Du nun bereits 3 Lösungen, oder noch keine :)
Soweit ich mich erinnern kann hieß es in PureBasic immer:
PureBasic Hilfe hat geschrieben:Bitte beachten Sie, dass sich in Strukturen ein statisches Array[] nicht so verhält wie das normale BASIC Array (definiert mittels Dim), um konform zum C/C++ Strukturen Format zu bleiben (was direkte API Strukturen Portierung ermöglicht). Dies bedeutet, dass a[2] ein Array von 0 bis 1 definiert, wogegen Dim a(2) ein Array von 0 bis 2 anlegt.
Also

Code: Alles auswählen

; ...
  byte.c[4] ;0...3
; ...
:bounce:
Danke dass ich auch mal die Möglichkeit bekomm dir was zu berichtigen.

Achja, der Typ .c gefällt mir nicht (Kompillier das nur mal im Unicode Modus, dann ist der Datenblock ja doppelt oder vierfach so groß und es sind nichtmehr einzelne Bytes). Neuerdings gibts doch .a.

[EDIT]
Ups das war ja garnicht Froggerproggers Code. :allright: Hätte ich früher wissen sollen :lol: . Aber Froggerprogger hat das mit der Arraygröße auch nicht gemerkt.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Umwandlung float in einen Hexstring

Beitrag von AND51 »

ts-soft hat geschrieben:Es geht darum, eine Floatzahl als Hex oder Binärstring zurückzuwandeln.
Es gibt weder hexadezimale Floatzahlenstring, noch binäre Floatzahlenstrings, somit
sind sie auch nicht zurückwandelbar, auch nicht mit einem Hörnchen-Schema :lol:
Achso. Ich dachte, er wolle eine Zahl in eine Binärkommazahl (oder Hex-Kommazahl) umwandeln und das Ergebnis, beispielsweise "BAD,F00D" nur als String speichern, weil es keinen nativen Datentyp dafür gibt.
Dann habe ich das Problem wohl falsch verstanden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten