Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249609 (11045)
  Suchen
 Zurück zur Übersicht
 AutorThema: Wer kann mir das Programmieren ? gg. Bezahlung !!
J.Wolf
Datum:24.06.01 02:34 Antwortenals Email verschicken (Sat-Slope@gmx.net) 


Leider behersche ich die Formel nicht.

Ich möchte Gleitkommazahlen (zB. 35.434345) als Hexadezimalzahlen darstellen (also die binäre Repräsentation der Gleitkommazahl hexadezimal dargestellt bekommen). Und umgekehrt !

Wenn's geht als 2 PROC Module mit Parameterübergabe.
PROC 1 = Gleitkommazahl -> 4 Byte Hex
PROC 2 = 4 Byte Hex -> Gleitkommazahl

Wichtig!: Es soll 6 stellig (nach Komma) arbeiten.

Bin auch bereit die Arbeit zu belohnen !

Email: Sat-Slope@gmx.net

J.Wolf


Thorsten
Datum:24.06.01 09:44 Antwortenals Email verschicken (galaxy@mrk-soft.de) 


>Ich möchte Gleitkommazahlen
>(zB. 35.434345)
>als Hexadezimalzahlen darstellen
>(also die binäre Repräsentation der
>Gleitkommazahl hexadezimal
>dargestellt bekommen). Und umgekehrt !

Hi. J.Wulf,

"Gleitkommazahlen" sind Zahlen, die keine
ganzen Zahlen sind, also Werte mit
Nachkommastellen.

Nun gibt es:

a) im Hexadezimalen Zahelnsystem nur ganze
Zahlen, also keine Gleitkommazahlen, da
die umrechnung von Dezimal auf HEX über
die Basis 16 fungiert. Das Hexadezimals
System wird sehr oft für die Programmierung
benutzt, um einen grossen Zahlenwert
kompakt darstellen zu können (siehe auch
Kursteil 3 auf meiner Homepage, Profan
Online Kurs), z.b entspricht die Dez. Zahl
164 in Hexform A4 , was deutlich kürzer
ist. Es gibt also keinen Dezimalpunkt im
Hexadezimalen System.

b) und die "binäre Repräsentation" wäre
eigentlich wieder was anderes, den BINÄR
bedeutet 1 und 0, womit der Rechner zwars
Intern Arbeitet und z.b auch der Parallel-
oder Serial Port, aber als Darstelung im
Programm nur sehr selten benutzt wird.

Bitte beschreibe dein Problem etwas genauer,
welcher Anwendungszweck soll damit erfüllt
werden. !!!

gruss Thorsten



J.Wolf
Datum:24.06.01 12:26 Antwortenals Email verschicken (Sat-Slope@gmx.net) 


Hi,

Doch es soll möglich sein daß in 4 Byte eine Gleitkommazahl mit Vorzeichen (positiv/negativ) unterzubringen.

Die Fließkommazahl wird nach IEEE Standard codiert.
Dir Formel dafür steht hier, leider habe ich damit nicht viel anfangen können:

http://www-lehre.inf.uos.de/~ainf/1999/skript/node18.html#SECTION00242100000000000000

und hier:

http://www.ba-dresden.de/~engelhardt/grund/sld016.htm

Wenn ich dann die binäre Struktur der Gleitkommazahl habe kann ich es in 4 Byte Hex umrechnen.Wie es umgekehrt geht weiß ich nicht.

Mein Hexeditor hat zB. ein Tool mit der man in Float32 System umrechnen kann. Gebe ich zB. 12.256389 wird es als Hex $41441a2b angezeigt.(4 Byte)(und umgekehrt). Genau sowas will ich mit Profan haben.

Viele Anwendungen benutzen diese IEEE Standard um Gleitkommazahlen abzuspeichern.

Vorteil:
- Es bleibt immer bei 4 Byte (egal wie groß und wie klein die Gleitkommazahl ist)
- Die Werte sind mit ein Hex Editor nicht ablesbar.

Ich hoffe daß ich ausführlich genug war.
So ein Konverter Programm in Profan brauche ich unbedingt! ;)

mfG

J.Wolf


Frank Abbing
Datum:24.06.01 14:42 Antwortenals Email verschicken (frankabbing@12move.de) 


Hallo,

ich hab' ein kleines Tool gefunden, vielleicht hilft dir das ein bischen weiter. Schick ich dir per email. Leider ohne Source...

Frank


Sebastian König
Datum:24.06.01 14:57 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

Profan²-Float-Variablen (!) werden im IEEE 754 Standard (64bit) gespeichert. Für meine DirectX-Quellcodes habe ich mal eine Prozedur geschrieben, um 64bit-Floats in 32bit-Floats (ebenfalls IEEE 754) zu konvertieren. Das Ergebnis wird in einer LongInt-Variable (&) gespeichert. Wenn Du den Wert dieser Variablen binär in eine Datei schreibst, solltest Du das gewünschte Ergebnis erhalten.
Unten findest Du die Prozedur - eine Bezahlung ist natürlich nicht notwendig, da die Prozedur Teil eines kostenlosen Beispiel-Quellcodes von mir ist.
DEF MoveMemory(3) !"KERNEL32","RtlMoveMemory"

'++++++++++++++++
'+ Double2Float
'+
'+ Prozedur zum Konvertieren von 64bit-IEEE-Floats zu 32bit-IEEE-Floats.
'+
'+ Parameter:
'+  1. d!       : Fließkommazahl
'+  2. pTarget& : Addresse, an der das Ergebnis gespeichert werden soll

proc Double2Float
parameters d!,pTarget&

 declare double!
 declare HIDWORD&,LODWORD&
 declare sign&,exp&,mant&
 declare float&

 let double! = d!

 MoveMemory(Addr(LODWORD&),Addr(double!),4)
 MoveMemory(Addr(HIDWORD&),@add(Addr(double!),4),4)

 if @lt(HIDWORD&,0)
  let sign& = 1
  let HIDWORD& = SetBit(HIDWORD&,31,0)
 else
  let sign& = 0
 endif

 let exp& = HIDWORD& >> 20 - 1023 + 127
 let mant& = ((HIDWORD& << 12) >> 12) | (LODWORD& >> 29)

 let float& = (exp& << 23) | mant& << 3

 if (sign&)
  let float& = SetBit(float&,31,1)
 endif

 if @equ(double!,0.00000000)
  let float& = $00000000
 endif

 MoveMemory(pTarget&,Addr(float&),4)

endproc

Um die 32bit-Floats wieder in 64bit-Floats zu konvertieren, kannst Du folgende Prozedur verwenden:
'++++++++++++++++
'+ Float2Double
'+
'+ Prozedur zum Konvertieren von 32bit-IEEE-Floats zu 64bit-IEEE-Floats.
'+
'+ Parameter:
'+  1. f&       : 32Bit-Fließkommazahl (LongInt)
'+  2. pTarget& : Addresse, an der das Ergebnis gespeichert werden soll

proc Float2Double
parameters f&,pTarget&

 declare float&
 declare HIDWORD&,LODWORD&
 declare sign&,exp&,mant&

 let float& = f&

 if @lt(float&,0)
  let sign& = 1
  let float& = SetBit(float&,31,0)
 else
  let sign& = 0
 endif

 let exp& = float& >> 23 + 1023 - 127
 let mant& = (float& << 9) >> 9

 let HIDWORD& = (exp& << 20) | (mant& >> 3)
 let LODWORD& = mant& << 29

 if (sign&)
  let HIDWORD& = SetBit(HIDWORD&,31,1)
 endif

 if @equ(float&,$00000000)
  clear HIDWORD&
  clear LODWORD&
 endif

 MoveMemory(pTarget&,Addr(LODWORD&),4)
 MoveMemory(@add(pTarget&,4),Addr(HIDWORD&),4)

endproc

Du kannst die 64bit-Profan²-Floats natürlich auch direkt in eine Datei schreiben...

Ich hoffe, ich konnte Dir helfen!

MfG

Sebastian


J.WOlf
Datum:24.06.01 22:58 Antwortenals Email verschicken (Sat-Slope@gmx.net) 


Danke für eure hilfen.

@Sebastian: Nach Deinem Beispiel habe ich ein PowerBasic Code gefunden der in Porfan Code konvertiert muss.
Ich hoffe daß einer das kann. Mit Power Basic kenne ich mich leider nicht aus.

cu

J.Wolf


J.Wolf
Datum: 25.06.01 02:22 Antwortenals Email verschicken (netmasterr@gmx.net) 


Ich hab' was ich haben wollte.

Dank Sebastians Beispielcodes habe ich es geschafft.

Nochmals vielen vielen dank an euch alle die mir geholfen haben.
Ohne euch hätte ich es nie geschafft.

cu

J.Wolf


 Zurück zur Übersicht