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 * JSB EXP * (A,B) = ASCII "07OF" * (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