📄 gamma.s
字号:
.globl gamma, _gamma, signgam, _signgam.globl log, sinhalf = 040000one = 40200two = 40400eight = 41000large = 77777ldfps = 170100^tststfps = 170200^tst// gamma computes the log of the abs of the gamma function./ gamma accepts its argument and returns its result/ in fr0. The carry bit is set if the result is/ too large to represent./ The sign of the gamma function is/ returned in the globl cell signgam.// The coefficients for expansion around zero/ are #5243 from Hart & Cheney; for expansion/ around infinity they are #5404.// movf arg,fr0/ jsr pc,gamma/ movf fr0,.../_gamma: mov r5,-(sp) mov sp,r5 movf 4(r5),fr0 jsr pc,gamma mov (sp)+,r5 rts pcgamma: stfps -(sp) ldfps $200 clr signgam movf fr1,-(sp) tstf fr0 cfcc ble negative cmpf $eight,fr0 cfcc blt asymptotic jsr pc,regular/lret: jsr pc,log bec ret 4ret: movf (sp)+,fr1 ldfps (sp)+ clc rts pc/erret: movf $large,fr0 movf (sp)+,fr1 ldfps (sp)+ sec rts pc// here for positive x > 8/ the log of the gamma function is/ approximated directly by the asymptotic series./asymptotic: movf fr0,-(sp) movf fr0,fr1 jsr pc,log subf $half,fr1 mulf fr1,fr0 subf (sp),fr0 addf goobie,fr0/ movf $one,fr1 divf (sp)+,fr1 movf fr0,-(sp) movf fr1,-(sp) mulf fr1,fr1/ mov r0,-(sp) mov $p5p,r0 mov $5,-(sp) movf *(r0)+,fr01: mulf fr1,fr0 addf *(r0)+,fr0 dec (sp) bne 1b tst (sp)+ mov (sp)+,r0 mulf (sp)+,fr0 addf (sp)+,fr0 br ret// here on negative/ the negative gamma is computed/ in terms of the pos gamma./negative: absf fr0 movf fr0,fr1 mulf pi,fr0 jsr pc,sin negf fr0 cfcc beq erret bgt 1f inc signgam absf fr01: mov signgam,-(sp) mulf fr1,fr0 divf pi,fr0 jsr pc,log movf fr0,-(sp) movf fr1,fr0 jsr pc,gamma addf (sp)+,fr0 negf fr0 mov (sp)+,signgam br ret// control comes here for arguments less than 8./ if the argument is 2<x<3 then compute by/ a rational approximation./ if x<2 or x>3 then the argument/ is reduced in range by the formula/ gamma(x+1) = x*gamma(x)/regular: subf $two,fr0 cfcc bge 1f addf $two,fr0 movf fr0,-(sp) addf $one,fr0 movf fr0,-(sp) addf $one,fr0 jsr pc,regular divf (sp)+,fr0 divf (sp)+,fr0 rts pc1: cmpf $one,fr0 cfcc bgt 1f addf $one,fr0 movf fr0,-(sp) subf $two,fr0 jsr pc,1b mulf (sp)+,fr0 rts pc1: movf fr2,-(sp) mov r0,-(sp) mov $p4p,r0 mov $6,-(sp) movf fr0,fr2 movf *(r0)+,fr01: mulf fr2,fr0 addf *(r0)+,fr0 dec (sp) bne 1b mov $7,(sp) movf fr2,fr1 br 2f1: mulf fr2,fr12: addf *(r0)+,fr1 dec (sp) bne 1b tst (sp)+ mov (sp)+,r0 divf fr1,fr0 movf (sp)+,fr2 rts pc/.datap4p: p6;p5;p4;p3;p2;p1;p0 q6;q5;q4;q3;q2;q1;q0/ p6 = -.67449 50724 59252 89918 d1/ p5 = -.50108 69375 29709 53015 d2/ p4 = -.43933 04440 60025 67613 d3/ p3 = -.20085 27401 30727 91214 d4/ p2 = -.87627 10297 85214 89560 d4/ p1 = -.20886 86178 92698 87364 d5/ p0 = -.42353 68950 97440 89647 d5/ q7 = 1.0 d0/ q6 = -.23081 55152 45801 24562 d2/ q5 = +.18949 82341 57028 01641 d3/ q4 = -.49902 85266 21439 04834 d3/ q3 = -.15286 07273 77952 20248 d4/ q2 = +.99403 07415 08277 09015 d4/ q1 = -.29803 85330 92566 49932 d4/ q0 = -.42353 68950 97440 90010 d5p1: 143643 26671 36161 72154p2: 143410 165327 54121 172630p3: 142773 10340 74264 152066p4: 142333 125113 176657 75740p5: 141510 67515 65111 24263p6: 140727 153242 163350 32217p0: 144045 70660 101665 164444q1: 143072 43052 50302 136745q2: 43433 50472 145404 175462q3: 142677 11556 144553 154177q4: 142371 101646 141245 11264q5: 42075 77614 43022 27573q6: 141270 123404 76130 12650q0: 144045 70660 101665 164444p5p: s5;s4;s3;s2;s1;s0// s5 = -.16334 36431 d-2/ s4 = +.83645 87892 2 d-3/ s3 = -.59518 96861 197 d-3/ s2 = +.79365 05764 93454 d-3/ s1 = -.27777 77777 35865 004 d-2/ s0 = +.83333 33333 33331 01837 d-1/ goobie = 0.91893 85332 04672 74178 d0s5: 135726 14410 15074 17706s4: 35533 42714 111634 76770s3: 135434 3200 171173 156141s2: 35520 6375 12373 111437s1: 136066 5540 132625 63540s0: 37252 125252 125252 125047goobie: 40153 37616 41445 172645pi: 40511 7732 121041 64302.bss_signgam:signgam:.=.+2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -