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

  1. # double exp(arg)
  2. # double arg; 0<= arg< 88
  3. # double exp10(arg)
  4. # method: range reduction to [-0.5,0.5], Hart&Chenet EXPB 1067
  5. # J F Jarvis, August 5, 1978
  6. .set    ERANGE,34
  7. .globl    _exp
  8. .globl    _exp10
  9. .globl    _errno
  10. .text
  11. .align    1
  12. _exp10:
  13.     .word    0x07c0
  14.     muld3    4(ap),loge10,r0
  15.     jbr    argtst
  16. .align    1
  17. _exp:
  18.     .word    0x07c0
  19.     movd    4(ap),r0
  20. argtst:
  21.     jnequ    smlarg
  22.     movd    $0d1.0e+0,r0
  23.     ret
  24. smlarg:
  25.     cmpd    r0,minarg
  26.     jgeq    lrgarg
  27.     mnegd    huge,r0
  28.     ret
  29. lrgarg:
  30.     cmpd    r0,maxarg
  31.     jleq    range
  32.     movl    $ERANGE,_errno
  33.     movd    huge,r0
  34.     ret
  35. range:
  36.     emodd    log2e,log2ex,r0,r10,r6    # r10=int(arg), r6=frac(arg)
  37.     tstd    r0
  38.     jgtr    l1
  39.     addd2    $0d0.5e+0,r6
  40.     subw2    $1,r10
  41.     jbr    l2
  42. l1:    subd2    $0d0.5e+0,r6
  43. l2:            # Hart&Cheney EXPB 1067
  44.     muld3    r6,r6,r8    # range [-.5,.5] D=18.1
  45.     polyd    r8,$2,pcoef
  46.     muld2    r0,r6
  47.     polyd    r8,$2,qcoef
  48.     subd3    r6,r0,r2
  49.     addd2    r6,r0
  50.     divd2    r2,r0
  51.     muld2    sqrt2,r0
  52.     extzv $7,$8,r0,r2
  53.     addl2    r2,r10
  54.     insv    r10,$7,$8,r0    # load correct exponent
  55.     ret
  56. .data
  57. .align    2
  58. pcoef:
  59.     .double    0d0.23093347753750233624e-1
  60.     .double    0d0.20202065651286927227886e+2
  61.     .double    0d0.15139067990543389159e+4
  62. qcoef:
  63.     .double    0d0.1e+1
  64.     .double    0d0.23318421142748162379e+3
  65.     .double    0d0.43682116627275584985e+4
  66. minarg:
  67.     .double    0d-88.028e+0
  68. maxarg:
  69.     .double    0d88.028e+0
  70. huge:    .double    0d1.7e+38
  71. loge10:
  72.     .double    0d2.30258509299404568401e+0
  73. sqrt2:
  74.     .double    0d1.41421356237309504880e+0
  75. log2e:
  76.     .double    0d1.44269504088896340735e+0
  77. log2ex:
  78.     .byte    0xbb
  79.