I've been trying to adapt faq184-1932 Float64ToNum to work with the 48 bit Pascal Real data type.
So far, I've been unsuccessful...
Here's a description of the difference:
Here's my code so far:
Any help would be appreciated!
So far, I've been unsuccessful...
Here's a description of the difference:
Here's my code so far:
Code:
LPARAMETERS Float48 AS STRING
* Pascal Real:
*** S MMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM EEEEEEEE
* 1 2345678 90123456 78901234 56789012 34567890 12345678
* 1 2 3 4
* 64 bit float:
*!* S XXXXXXX XXXX MMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM
*!* 0 0000000 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000
*!* 1 2345678 9012 3456 78901234
*!* 1 2 3
LOCAL SIGN AS INTEGER
LOCAL Bias AS INTEGER
LOCAL Exponent AS INTEGER
LOCAL I AS INTEGER
LOCAL x AS STRING
LOCAL Mantissa AS NUMBER
LOCAL OldDecimals AS INTEGER
LOCAL oldFixed AS STRING
IF LEN(Float48) < 6
RETURN 0
ENDIF
*OldDecimals=SET("Decimals")
*SET DECIMALS TO 20
oldFixed=SET("Fixed")
SET FIXED OFF
Mantissa = 1
SIGN = 0
Bias = 129 && 64bit bias: 1023
Exponent = 0
Float48 = LEFT(Float48,6)
SIGN=IIF(BITTEST(ASC(LEFT(Float48,1)),7),-1,1)
FOR I=48 TO 41 STEP -1
Exponent=Exponent+IIF(BITTEST(ASC(SUBSTR(Float48,INT((I-1)/8)+1,1)),7-MOD((I-1),8)),1,0) * (2^(47-I))
* Exponent=Exponent+IIF(BITTEST(ASC(SUBSTR(Float64,INT((I-1)/8)+1,1)),7-MOD((I-1),8)),1,0)*(2^(12-I))
NEXT
Exponent=Exponent-bias
FOR I=2 TO 40
AA=INT((I-1)/8)+1
BB=7-MOD((I-1),8)
B=IIF(BITTEST(ASC(SUBSTR(Float48,INT((I-1)/8)+1,1)),7-MOD((I-1),8)),1,0)
Mantissa=Mantissa+IIF(BITTEST(ASC( SUBSTR(Float48,INT((I-1)/8)+1,1)), 7-MOD((I-1),8)),1,0) * (1/(2^(I-1)))
* Mantissa=Mantissa+IIF(BITTEST(ASC(SUBSTR(Float64,INT((I-1)/8)+1,1)),7-MOD((I-1),8)),1,0)*(1/(2^(I-12)))
NEXT
SET FIXED &oldFixed
RETURN SIGN*(Mantissa)*(2^Exponent)
ENDFUNC