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

  1. # double log(arg) ; natural logarithm
  2. # double log10(arg); base 10 log
  3. # double arg
  4. # if(arg<=0){ errno=EDOM; return(-1.7e+38); }
  5. # nat. log computed from Hart&Cheney LOGE 2706 D=22.1
  6. # J F Jarvis August 3, 1978
  7. .set    EDOM,33
  8. .globl    _log
  9. .globl    _log10
  10. .globl    _errno
  11. .text
  12. .align    1
  13. _log10:
  14.     .word    0x0
  15.     movd    4(ap),-(sp)
  16.     calls    $2,_log
  17.     muld2    log10e,r0
  18.     ret
  19. .align    1
  20. _log:
  21.     .word    0x07c0
  22.     movd    4(ap),r0
  23.     jgtr    range
  24.     movl    $EDOM,_errno
  25.     movd    $0d-1.7e+38,r0    # machine dept max neg
  26.     ret
  27. range:
  28.     extzv    $7,$8,r0,r10    # r10 = exp(arg)+128
  29.     insv    $128,$7,$8,r0    # r0,r1: 0.5<=frac(arg)<1.0
  30.     cmpd    r0,sqrt2d2
  31.     jgeq    comp
  32.     insv    $129,$7,$8,r0    # frac *= 2
  33.     decl    r10                # exp -= 1
  34. comp:
  35.     subl2    $128,r10    # signed exp for scaled arg
  36.     subd3    $0d1.0e+0,r0,r6    # Hart&cheney LOGE 2706
  37.     addd2    $0d1.0e+0,r0
  38.     divd2    r0,r6    # r6,r7= (frac-1)/(frac+1)
  39.     muld3    r6,r6,r8
  40.     polyd    r8,$3,pcoef
  41.     muld2    r0,r6
  42.     polyd    r8,$4,qcoef
  43.     divd3    r0,r6,r0
  44.     cvtld    r10,r2
  45.     muld2    log2,r2    # r2,r3= loge(2**exp)
  46.     addd2    r2,r0
  47.     ret
  48. .data
  49. .align    2
  50. pcoef:
  51.     .double    0d-0.24550691103445385056e+2
  52.     .double    0d0.23616053565907671809e+3
  53.     .double    0d-0.54904361859132995001e+3
  54.     .double    0d0.35621151669903912407e+3
  55. qcoef:
  56.     .double    0d0.10e+1
  57.     .double    0d-0.35526251110400238735e+2
  58.     .double    0d0.19375591463035879517e+3
  59.     .double    0d-0.33389039541217149928e+3
  60.     .double 0d0.17810575834951956204e+3
  61. log10e:
  62.     .double    0d0.43429448190325182765e+0
  63. sqrt2d2:
  64.     .double    0d0.70710678118654752440e+0
  65. log2:
  66.     .double    0d0.69314718055994530941e+0
  67.