Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249609 (11045)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Wer kann mir das Programmieren ? gg. Bezahlung !!
J.Wolf
| Datum:24.06.01 02:34 (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 (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 (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 (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 (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 (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 (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