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

  1. # double atan(arg1); -pi/2 < atan < pi/2
  2. #double atan2(arg1,arg2); -pi< atan2<pi
  3. #double arg1,arg2
  4. #method: range reduction to [sqrt(2)-1,sqrt(2)+1]
  5. # followed by Hart&Cheney ARCTN 5076 D=17.55
  6. # J. F. Jarvis August 8, 1978
  7. .globl    _atan
  8. .globl    _atan2
  9. .text
  10. .align    1
  11. _atan:
  12.     .word    0x03c0
  13.     movd    4(ap),r0
  14.     jgtr    a1
  15.     mnegd    r0,r0    # atan(arg1), arg1<0
  16.     bsbb    satan
  17.     mnegd    r0,r0
  18.     ret
  19. a1:    bsbb    satan    # atan(arg1), arg1>=0
  20.     ret
  21. #
  22. .align    1
  23. _atan2:
  24.     .word    0x03c0
  25.     movd    4(ap),r0    # atan(arg1/arg2)
  26.     movd    12(ap),r2
  27.     addd3    r0,r2,r4
  28.     cmpd    r0,r4
  29.     jneq    b1
  30.     tstd    r0
  31.     jgeq    b2
  32.     mnegd    pio2,r0
  33.     ret
  34. b2:    movd    pio2,r0
  35.     ret
  36. #
  37. b1:    tstd    r2
  38.     jgeq    b3
  39.     divd2    r2,r0
  40.     jleq    b4
  41.     bsbb    satan    # arg1<0, arg2<0
  42.     subd2    pi,r0
  43.     ret
  44. b4:    mnegd    r0,r0    # arg1>0, arg2<0
  45.     bsbb    satan
  46.     subd3    r0,pi,r0
  47.     ret
  48. #
  49. b3:    divd2    r2,r0
  50.     jleq    b5
  51.     bsbb    satan    # arg1>0, arg2>0
  52.     ret
  53. b5:    mnegd    r0,r0    # arg1<0, arg2>0
  54.     bsbb    satan
  55.     mnegd    r0,r0
  56.     ret
  57. #
  58. .globl    satan
  59. satan:    # range reduction on positive arg(r0)
  60.     cmpd    r0,sq2m1
  61.     jgeq    c1
  62.     bsbb    xatan
  63.     rsb
  64. c1:    cmpd    r0,sq2p1
  65.     jleq    c2
  66.     divd3    r0,$0d1.0e+0,r0
  67.     bsbb    xatan
  68.     subd3    r0,pio2,r0
  69.     rsb
  70. c2:    addd3    $0d1.0e+0,r0,r2
  71.     subd2    $0d1.0e+0,r0
  72.     divd2    r2,r0
  73.     bsbb    xatan
  74.     addd2    pio4,r0
  75.     rsb
  76. #
  77. xatan:    # compute arctan(r0) for:sqrt(2)-1<r0<sqrt(2)+1
  78. # Hart&Cheney ARCTN 5076 is evaluated
  79.     movd    r0,r8
  80.     muld3    r0,r0,r6
  81.     polyd    r6,$4,pcoef
  82.     muld2    r0,r8
  83.     polyd    r6,$4,qcoef
  84.     divd3    r0,r8,r0
  85.     rsb
  86. .data
  87. .align    2
  88. pcoef:
  89.     .double 0d0.1589740288482307048e+0
  90.     .double 0d0.66605790170092626575e+1
  91.     .double 0d0.40969264832102256374e+2
  92.     .double 0d0.77477687719204208616e+2
  93.     .double 0d0.44541340059290680319e+2
  94. qcoef:
  95.     .double 0d1.0e+0
  96.     .double 0d0.15503977551421987525e+2
  97.     .double 0d0.62835930511032376833e+2
  98.     .double 0d0.92324801072300974840e+2
  99.     .double 0d0.44541340059290680444e+2
  100. pio4: .double  0d0.78539816339744830961e+0
  101. pio2: .double  0d1.57079632679489661923e+0
  102. sq2p1: .double 0d2.41421356237309504880e+0
  103. sq2m1: .double 0d0.41421356237309504880e+0
  104. pi: .double 0d3.14159265358979323846e+0
  105.