•  Back 
  •  Main 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help 
  •  Show info about hypertext 
  •  View a new file 
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 ---------------------------------
CLS
DO
  INPUT "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!=FALSE
  ENDIF
  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)"
  PRINT
LOOP
--------------------------------- 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
    IF BTST(m_h%,i&)=TRUE
      dual#=dual#+2^d_exp&
    ENDIF
    DEC d_exp&
  NEXT i&
  FOR i&=15 DOWNTO 0
    IF BTST(m_l%,i&)=TRUE
      dual#=dual#+2^d_exp&
    ENDIF
    DEC 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.