      TITLE F_DEXP
      MODULE F_DEXP
      EXPORTC F_DEXP
      IMPORTC F_ZSTE,F_HANDLER
      AREADEF PROG,[PIC,READ,SHARED,CODE],DOUBLE
      AREADEF DATA,[WRITE,DATA],DOUBLE
      DEFSB   DATA
      AREA    PROG
      DCS     'F_DEXP       '
F_DEXP


      SPRD   FP,TOS
      LPRD   FP,12(SP)
      MOVL   0(0(FP)),F0
      MULL   =1.4426950408889634,F0 ;/Log2
      CMPL   =-1022.0,F0
      BGT    zero                   ;arg too small
      CMPL   =1024.0,F0
      BLE    inf                    ;arg too big
      ROUNDLD F0,R0
      MOVDL  R0,F2
      SUBL   F2,F0                  ;-1/2<X<1/2
      MOVL   F0,F2
      MULL   F2,F2                  ;X**2
      MOVL   =0.0230932376686,F4
      MULL   F2,F4
      ADDL   =20.2021070020417,F4
      MULL   F2,F4
      ADDL   =1513.9116196661376,F4
      MULL   F4,F0                  ;A*X
      MOVL   F2,F4
      ADDL   =233.1848876394516,F4
      MULL   F4,F2
      ADDL   =4368.2255720730305,F2 ;B
      MOVL   F0,F4
      ADDL   F2,F0                  ;B+AX
      SUBL   F4,F2                  ;B-AX
      DIVL   F2,F0
      MOVL   F0,ans
      ASHW   =4,R0
      ADDW   R0,ans+6
fin   ADDR   ans,R0
      LPRD   FP,TOS
      RXP    4
zero  MOVQD  0,ans
      MOVQD  0,ans+4
      BR     fin
inf   ADDR    mess,TOS
      CXP     F_ZSTE
      HANDLER
      CXP     F_HANDLER
txt   DCS     'argument too big in DEXP'
lgt   EQU     *
      AREA    DATA
ans   ALLOCD  2
mess  ADDRESS mm
mm    ADDRESS txt
      DCD     lgt-txt
      END
