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
|