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 "SQRT" - SINGLE PRECISION SQUARE ROOT.
      NAM SQRT,6 24998-1X181 REV.2001 780424
* 
      ENT SQRT
      EXT .ZPRV,.FLUN,.PWR2 
* 
A     EQU 0 
B     EQU 1 
* 
*     SQRT TAKES THE SINGLE-PRECISION SQUARE ROOT OF A SINGLE-PRECISION 
*     ARGUMENT. 
* 
*     CALLING SEQUENCE: 
*                   DLD <ARG> 
*                   JSB SQRT
*                   <ERROR RETURN>   (A,B) = ASCII "03UN" 
*                   <NORMAL RETURN>  (A,B) = RESULT 
* 
*     THE ERROR RETURN IS TAKEN IF THE ARGUMENT IS NEGATIVE.
* 
*     METHOD:  THE RANGE IS REDUCED TO [0.5,2) USING THE IDENTITY:
* 
*                   SQRT(X) = (2**N) * SQRT(X/2**N) 
* 
*     IN THIS RANGE, THE INITIAL APPROXIMATION X0 = A*X+B IS USED,
*     WHERE:
*                   X0 = .59016 * Y  +  .41778   IN [0.5,1) 
*           AND     X0 = .41778 * Y  +  .59016   IN [1,2) 
* 
*     GIVING AT LEAST 7 BITS ACCURACY.  HERON'S RULE IS APPLIED TWICE,
*     GIVING  2*X1 = (X1+Y/X1)  AND  4*X2 = (2*X1)+(4*Y)/(2*X1) .  THE
*     RESULT IS THEN X2 * 2**(N-2), USING .PWR2 . 
      SKP 
*                   CHECK X <= 0, FORM X0 = INITIAL APPROXIMATION 
* 
SQRT  NOP 
      JSB .ZPRV     FOR SHARING.
      DEF LIBX
      SSA           < 0 ? 
      JMP ERROR     YES, ERROR
      ISZ SQRT      NO, GOOD RETURN 
      SZA,RSS       = 0 ? 
      JMP LIBX      YES, RESULT = 0 
      STA Y         SCALE: FIRST WORD IS SAME 
      JSB .FLUN     FORCE TO [0.5,1)
      ADA =D-4      2*N-4 
      SLA,ERA       N-2: AT END, MULT. BY 2**(N-2) = (2**N)/4 
      ADB =D2       IF REMAINDER ODD, FORCE TO [1,2)
      RAL,ARS       RESTORE SIGN BIT
      STA N 
      STB Y+1 
      LDA Y 
      SEZ           IN [.5,1) ? 
      JMP SQRT1     NO
      FMP A1B2      IN [0.5,1): X0 = A1*Y+B1
      FAD A2B1
      JMP SQRT2 
SQRT1 FMP A2B1      IN [1,2): X0 = A2*Y+B2
      FAD A1B2
SQRT2 STA X         SAVE X0 
      STB X+1 
* 
*                   TWO HERON'S STEPS 
* 
      LDA Y 
      LDB Y+1 
      FDV X         Y/X0
      FAD X         2*X1 = X0+Y/X0
      STA X 
      STB X+1 
      LDA Y 
      LDB Y+1 
      ADB =D4       4*Y 
      FDV X         (4*Y)/(2*X1) = 2*(Y/X1) 
      FAD X         4*X2 = 2*X1 + 2*(Y/X1)
      JSB .PWR2     MULTIPLY BY (2**N)/4
      DEF N 
LIBX  JMP SQRT,I    EXIT
      DEF SQRT
      SKP 
*                   ERROR PROCESSING
* 
ERROR LDA =A03      RETURN ASCII "03UN" 
      LDB =AUN
      JMP LIBX
* 
*                   LOCALS & CONSTANTS. 
* 
Y     BSS 2         SCALED ARG
X     BSS 2         CURRENT APPROXIMATION 
N     BSS 2         (SCALE FACTOR) - 2
A1B2  OCT 045612    FIRST WORD 0.59016
A2B1  OCT 065400    SECOND WORD 0.59016, FIRST WORD 0.41778 
      OCT 000377    SECOND WORD 0.41778 
      END 
                                                                                                                                                                                      