home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntlib16.lzh / MNTLIB16 / FREXP.CPP < prev    next >
Text File  |  1993-08-03  |  2KB  |  68 lines

  1.  | remove exponent from floating point number
  2.  | C Interface
  3.  | double frexp(double value, int *eptr)
  4.  |
  5.  | returns significand (|significand| < 1)
  6.  |       in *eptr returns n such that value = significand * 2**n
  7.  |-----------------------------------------------------------------------------
  8.  | ported to 68000 by Kai-Uwe Bloem, 12/89
  9.  |  #1  original author: Peter S. Housel 9/21/88,01/17/89,03/19/89,5/24/89
  10.  |  #2    added support for denormalized numbers            -kub-, 01/90
  11.  |  #   ported to gcc  ++jrb 04/90
  12.  |-----------------------------------------------------------------------------
  13.  
  14. BIAS8    =    0x3ff - 1
  15.  
  16.     .text; .even
  17.     .globl _frexp
  18. _frexp:
  19.     movel    sp@(12),a0    | initialize exponent for loop
  20. #ifdef __MSHORT__
  21.     clrw    a0@
  22. #else
  23.     clrl    a0@
  24. #endif
  25.     lea    sp@(4),a1
  26.     moveml    d2-d7,sp@-
  27. 2:
  28.     movew    a1@,d0        | extract value.exp
  29.     movew    d0,d2        | extract value.sign    ++jrb
  30.     lsrw    #4,d0
  31.     andw    #0x7ff,d0    | kill sign bit
  32.     cmpw    #BIAS8,d0    | get out of loop if finally (a1) in [0.5,1.0)
  33.     beq    3f
  34.  
  35.     andw    #0x0f,a1@    | remove exponent from value.mantissa
  36.     tstw    d0        | check for zero exponent - no leading 1
  37.     beq    0f
  38.     orw    #0x10,a1@    | restore implied leading 1
  39.     bra    1f
  40. 0:    addw    #1,d0
  41. 1:
  42.     movel    a1@,d1        | check for zero
  43.     orl    a1@(4),d1
  44.     beq    3f        | if zero, all done : exp = 0, num = 0.0
  45.  
  46.     subw    #BIAS8,d0    | remove bias
  47. #ifdef __MSHORT__        
  48.     addw    d0,a0@        | add current exponent in
  49. #else
  50.     extl    d0
  51.     addl    d0,a0@        | add current exponent in
  52. #endif
  53.  
  54.     movew    #BIAS8,d0    | set bias for return value
  55.     clrw    d1        | rounding = 0
  56.     pea    L0        | call to norm_df (dirty, but dont ...
  57.     moveml    d2-d7,sp@-    | ... need to copy with -mshort)
  58.     moveml    a1@,d4-d5
  59.     jmp    norm_df        | normalize result
  60. L0:
  61.     moveml    d0-d1,a1@
  62.     bra    2b        | loop around to catch denormalized numbers
  63. 3:
  64.     moveml    a1@,d0-d1
  65.     moveml    sp@+,d2-d7
  66.                 | d0-d1 has normalized mantissa
  67.     rts
  68.