ASMB,L,R,C
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
*   NAME: PART OF MATH LIBRARY
*   SOURCE:  24998-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED "EXP" - SINGLE PRECISION EXPONENTIAL FUNCTION.
      NAM EXP,6 24998-1X167 REV.2001 780424 
* 
      ENT EXP 
      EXT .ZPRV,.CMRS,.PWR2 
* 
*     EXP TAKES THE SINGLE-PRECISION EXPONENTIAL (E**X) OF A
*     SINGLE-PRECISION ARGUMENT.
* 
*     CALLING SEQUENCE: 
* 
*                   DLD <ARG> 
*                   JSB EXP 
*                   <ERROR RETURN>   (A,B) = ASCII "07OF" 
*                   <NORMAL RETURN>  (A,B) = RESULT 
* 
*     THE ERROR RETURN IS TAKEN FOR ARGUMENTS GREATER THAN 88.029678
*     (OVERFLOW).  FOR ARGUMENTS LESS THAN -89.415985 THE NORMAL RETURN 
*     IS TAKEN BUT (A,B) = 0.0 (UNDERFLOW). 
* 
*     METHOD:  THE IDENTITY 
*                   EXP(X) = (2**N) * (2 ** (X/LN(2)-N) ) 
*     IS USED TO REDUCE THE COMPUTATION TO EVALUATING 2**(Y-1) ON 
*     [-0.5,+0.5] BY LETTING N BE THE CLOSEST INTEGER TO X/LN(2)+1 .
* 
*     THE FUNCTION 2**(Y-1) IS APPROXIMATED ON [-0.5,+0.5] BY:
* 
*                                Y
*                   0.5 + ------------------
*                          C1 - Y + C2*Y**2 
*     WHERE:
*                   C1 = 5.7708162
*                   C2 = .05761803
      SKP 
*                   RANGE REDUCTION AND BOUNDS CHECK. 
* 
EXP   NOP 
      JSB .ZPRV 
      DEF LIBX
      STA Y         REMEMBER SIGN IN CASE .CMRS OFL 
      JSB .CMRS     MULT BY 2/LN(2), EXTRACT EVEN INTEGER 
      DEF .2LN2 
      DEF N 
      JMP OFUFL     IF .CMRS OFL
      STA Y 
      STB Y+1 
      LDB N         HALF N (.CMRS DOUBLES IT) 
      BRS 
      INB           ADD ONE (FOR 2**(Y-1), NOT 2**Y)
      STB N 
      ADB =D-129    CHECK N IN [-127,128] 
      STB NMAX      -1 IFF N = 128
      SSA,RSS       IS 2**(Y-1) >= 0.5 ?
      INB           YES, ACCOUNT FOR THAT 
      SSB,RSS 
      JMP OFL       N > 128, OVERFLOW 
      ADB =D256 
      SSB 
      JMP UFL       N < -127, UNDERFLOW 
      LDB Y+1       RELOAD Y LOWER
* 
*                   EVALUATE 2**(Y-1) 
* 
      FMP Y         Y**2
      FMP C2        C2*YSQ
      FSB Y         -Y+C2/... 
      FAD C1        C1-Y+C2/... 
      STA TEMP
      STB TEMP+1
      LDA Y 
      LDB Y+1 
      FDV TEMP      Y (C1-...)
      FAD HALF      2**(Y-1) = 0.5+Y/...
*                   CHECK SPECIAL OVERFLOW CASE: Y IN (-EPS,0), N = 128 
*                   SO THAT 2**(Y-1) = 0.5 AND OUR RESULT = 2**127 .
*                   THIS TEST IS POSTPONED UNTIL NOW BECAUSE THE RANGE
*                   Y IN (-EPS,0) CANNOT EASILY BE SEEN TO PRODUCE
*                   2**(Y-1) = 0.5  UNTIL 2**(Y-1) IS CALCULATED. 
* 
      ISZ NMAX      N = 128 ? 
      JMP EXP1      NO. 
      SLB,RSS       2**(Y-1) .GE. 0.5 ? 
      JMP OFL       YES, TOO BIG. 
      SKP 
*                   MULTIPLY BY 2**N, EXIT. 
* 
EXP1  JSB .PWR2     USE .PWR2 TO DO *2**N 
      DEF N 
EXP2  ISZ EXP       GOOD EXIT 
LIBX  JMP EXP,I 
      DEF EXP 
* 
*                   OVERFLOW & UNDERFLOW HANDLING.
* 
OFUFL LDA Y         SEE WHICH 
      SSA,RSS 
      JMP OFL 
UFL   CLA           UNDERFLOW, SET ZERO & EXIT
      CLB 
      CLO 
      JMP EXP2
OFL   LDA =A07      OVERFLOW, RETURN ASCII "07OF" 
      LDB =AOF
      STO 
      JMP LIBX      TAKE ERROR EXIT 
* 
*                   LOCALS & CONSTANTS
* 
Y     BSS 2         REDUCED ARG 
TEMP  BSS 2         TEMP FOR REVERSE DIVIDES
N     BSS 1         BINARY SCALE FACTOR 
NMAX  BSS 1         -1 IFF N = 128 (MAX VALUE)
.2LN2 OCT 056125,016624,126404  2/LN(2) 
C1    DEC 5.7708162 
C2    DEC .05761803 
HALF  DEC 0.5 
      END 
                                                                                                                                                              