Topic : The GFA-Basic Compendium
Author : GFA Systemtechnik GmbH
Version : GFABasic.HYP v2.98 (12/31/2023)
Subject : Documentation/Programming
Nodes : 899
Index Size : 28056
HCP-Version : 3
Compiled on : Atari
@charset : atarist
@lang :
@default : Document not found
@help : Help
@options : +g -i -s +z
@width : 75
@hostname : STRNGSRV
@hostname : CAB
@hostname : HIGHWIRE
@hostname : THING
View Ref-FileFrom: Albin Laβ <Albin_Lass@HB2.maus.de>
Organization: MAUS Hansestadt Bremen 2 +49-421-702569
Newsgroups: <maus.computer.sprache.gfabasic>
Date: Wednesday, September 11, 2002 7:11 AM
Subject: Re: floating point conversion
Hi Lonny!
LP> How does GFA internally store these?
Byte: 0 1 2 3 4 5 | 6 7
Bit : 63 16 | 15 0
IMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM SEEEEEEEEEEEEEEE
<--------------- 48 bit Mantissa --------------> <--- 16 bit --->
^ (normalized) ^ Exponent
| | (bias=1023)
| |
+-- MSB = Integer Bit +-- Sign of Mantissa
Integer Bit is allways one, except number is zero (then all Bytes zero).If Exponent negative (sign of Mantissa is negative), than exp = -exp.
--------------------------------- schnipp ---------------------------------
CLSDOINPUT "Number: ";number#
addr%=V:number#
mantissa_h%={addr%}
mantissa_l%=CARD{addr%+4}
bias%=WORD{addr%+6}
PRINT "BYTE: 0 1 2 3 4 5 6 7"
PRINT "BIT : 63 16 15 0"
PRINT "BIN : ";BIN$(mantissa_h%,32);BIN$(mantissa_l%,16)'BIN$(bias%,16)
PRINT "HEX : ";HEX$(mantissa_h%,8);HEX$(mantissa_l%,4);SPACE$(37);HEX$(bias%,4)
b2%=bias%
IF bias%<0
neg!=TRUE bias%=-bias%
ELSE neg!=FALSEENDIF exponent%=bias%-1023
dual_value#=ABS(number#)/(2^exponent%)
PRINT "DEZ : ";LEFT$(STR$(dual_value#)+SPACE$(49),49);STR$(b2%);" (";STR$(exponent%);")"
PRINT "CALC: (";neg!;")^0 * ";STR$(dual_value#);" * 2^(";bias%;"-1023)"
PRINTLOOP--------------------------------- schnipp ---------------------------------
Ciao, ALbin.
From: Albin Laº <Albin_Lass@HB2.maus.de>
Organization: MAUS Hansestadt Bremen 2 +49-421-702569
Newsgroups: <maus.computer.sprache.gfabasic>
Date: Friday, September 13, 2002 3:42 AM
Subject: Re: floating point conversion
Hi Lonny!
Sorry for german writing! But, I'm a bad english writer. ;)
LP> I have been looking for such info for ages!
Ich hatte mal vor ca. 10 Jahren (in einem Bƒcherladen) in irgendeinem Buch
(ich glaube es war von Data Becker) geblèttert. Und darin war auch das
Format der GFA-Fliesskommazahlen beschrieben und ein Hinweis darauf, daº
das irgendeinem *IEEE*-Standard (wie auch die FPU-Datentypen) entsprechen
soll.
Suche also mal nach "IEEE" (die genaue Nummer und URL weiº ich leider nicht).LP> Did you figure this out on your own?
Ja. Und zwar durch Analyse eines reassemblierten GFA-Compilats und durch
Vergleich mit den dokumentierten FPU-Datentypen.
Und die Richtigkeit der Analyse hatte ich dann nochmal mit einem Beispiel-
Programm (was ich dir gepostet habe) ƒberprƒft.
Ach, ja. Da fehlen am Ende eigentlich noch einige Zeilen:
result#=(neg!^0*dual_value#)*2^exponent%
PRINT "RES : ";STR$(result#)
Ciao, ALbin.
From: Albin Laº <Albin_Lass@hb2.maus.de>
Organization: MAUS Hansestadt Bremen 2 (+49-421-702569)
To: <atari@q1.net>
Date: Monday, September 16, 2002 5:33 AM
Subject: floating point conversion
Hi Lonny!
LP> I don't know any German, but lucky for me there is translators. ;-)
Na, dann ... Hauptsache wir verstehen uns. ;)
LP> I have many books on GFA, but never found this info.
Tja, leider weiº ich nicht mehr, was das fƒr ein Buch das war. :(
Ich glaube es war _nicht nur_ ƒber GFA.
LP> I managed to add these myself after some test runs. ;-)
Hab ich mir auch (fast) schon so gedacht.
Mit einem Calculator wère das wohl auch nichts ... ;)
LP> In this line you reference the 'number#' itself.
Stimmt, ist ein wenig umstèndlich. Einfacherer wère es so: ;)
WORD{addr%+6}=1023
dual_value#=number#
LP> How would you figure out the floating point value of a float just
LP> based on the 8 bytes stored in ram?
Hatte ich ja schon geschrieben: einmal durch Anschauen (im Compilat) wie
die Routinen von GFA z.B. ein Long in ein Float wandelt (oder auch STR$(n#)).Und durch Vergleich mit den FPU-Datentypen. Die sind nèmlich IEEE-Standard.
Und wenn die GFA-Floats auch IEEE sind, dann sollte das ziemlich èhnlich
sein.
Beschrieben werden die FPU-Datentypen z.B. im Buch "68030 Assembly Language
Reference" (von Steve Williams (Addison-Wesley)) unter dem Kapitel 4.2.1.2
"Floating Point Intructions"/"Binary Floating Point Data Formats".Falls Du das Buch nicht zur Hand haben solltest: Ich hab's mal in ein
Hypertext (ST-Guide) umgeschrieben: :)
Fileliste der Maus @ OL (Phone: 0441-3844034): Gruppenprogrammteil Maus.Computer.Software.Hypertext
Nr. System Filename Bytes Dauer Abruf DpM Datum
260 ST TOS MC68030E.ZIP 429034 01:56 7 0.16 03.11.98
Programmier-Tool, Textfile, Freeware
Ausfuehrliche Dokumentation ueber die Motorola-Prozessoren MC68000 bis
MC68030. Mit FPU und MMU. (Hypertext, englisch). Von Albin Lass @ HB2
LP> The files I have, I have no way to know the float value before hand,
LP> if you follow me.
Nicht so ganz. Du willst wissen, wie die Bitwertigkeit der Mantisse ist?
Bit 47 46 45 44 43 42 41 ...
Wert 1 1/2 1/4 1/8 1/16 1/32 1/64 ...
oder 2^0 2^-1 2^-2 2^-3 2^-4 2^-5 2^-6 ...
LP> Thus, I cannot compute 'dual_value' at all.
Wie? Per Hand? Warum ƒberlèsst Du die Arbeit nicht dem Computer?
Ahh, ich verstehe: Du willst Beweise ... ;)
Dann setze mal Folgendes im Programm ein:
--------------------------------- schnipp ---------------------------------
...
calc_dual(mantissa_h%,mantissa_l%,dual_value#)
...
PROCEDURE calc_dual(m_h%,m_l%,VAR dual#)
CLR dual#,d_exp&
FOR i&=31 DOWNTO 0
IFBTST(m_h%,i&)=TRUE dual#=dual#+2^d_exp&
ENDIFDEC d_exp&
NEXT i&
FOR i&=15 DOWNTO 0
IFBTST(m_l%,i&)=TRUE dual#=dual#+2^d_exp&
ENDIFDEC d_exp&
NEXT i&
RETURN--------------------------------- schnapp ---------------------------------
LP> Many thanks for the info,
Bitte schÜÜÜnn!
LP> I am much closer than I was.
Na, hoffentlich bist Du _jetzt_ noch ein bischen _mehr_ schlauer geworden. ;)
LP> http://www.q1.net/~atari/
Hmm, ist da nicht auch ein Crack-Code bezƒglich LST->GFA drauf? :)
Ciao, ALbin.