home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 500 / 471 / rccl104 < prev    next >
Text File  |  1987-03-02  |  1KB  |  49 lines

  1. # double tanh(arg)
  2. # double arg
  3. # method: tanh(arg)=sinh(arg)/cosh(arg); if |arg|<0.5 sinh(9 is computed from
  4. # a polynomial approx otherwise from exp().
  5. # Only 1 call to exp() is made.
  6. # J F Jarvis, August 17, 1978
  7. .globl _tanh
  8. .globl _exp
  9. .text
  10. .align 1
  11. _tanh:
  12.     .word    0x7c0
  13.     clrl    r10    # sign bit
  14.     movd    4(ap),r6
  15.     jgeq    t1
  16.     movw    $0x8000,r10
  17.     xorw2    r10,r6    # co|arg|
  18. t1:    cmpd    r6,$0d2.0e+1
  19.     jleq    t2
  20.     movd    $0d1.0e+0,r0
  21.     xorw2    r10,r0
  22.     ret
  23. t2:    movd    r6,-(sp)
  24.     calls    $2,_exp
  25.     movd    r0,r8
  26.     divd3    r8,$0d1.0e+0,-(sp)    # exp(-|arg|)
  27.     cmpd    r6,$0d0.5e+0
  28.     jgeq    t3
  29.     muld3    r6,r6,r0    # |arg|<0.5, sinh() from poly approx
  30.     polyd    r0,$5,pcoef
  31.     muld2    r6,r0
  32.     muld2    $0d2.0e+0,r0    
  33.     jbr    t4
  34. t3:    subd3    (sp),r8,r0
  35. t4:                # r0,1 = 2*sinh(|arg|)
  36.     addd3    (sp),r8,r2    # r2,3 = cosh(|arg|);
  37.     divd2    r2,r0    # r0,1 = tanh(|arg|)
  38.     xorw2    r10,r0    # r0,1 = tanh(arg)
  39.     ret
  40. .data
  41. .align    2
  42. pcoef:
  43.     .double 0d0.251726188251e-7
  44.     .double 0d0.275569807356154e-5
  45.     .double 0d0.1984127027907999e-3
  46.     .double 0d0.833333333307759961e-2
  47.     .double 0d0.16666666666667212324e+0
  48.     .double 0d0.99999999999999998116e+0
  49.