UNPKG

1.68 kBtext/coffeescriptView Raw
1#-----------------------------------------------------------------------------
2#
3# Author : philippe.billet@noos.fr
4#
5# Gamma function gamma(x)
6#
7#-----------------------------------------------------------------------------
8
9
10
11
12Eval_gamma = ->
13 push(cadr(p1))
14 Eval()
15 gamma()
16
17gamma = ->
18 save()
19 gammaf()
20 restore()
21
22gammaf = ->
23 # double d
24
25 p1 = pop()
26
27 if (isrational(p1) && MEQUAL(p1.q.a, 1) && MEQUAL(p1.q.b, 2))
28 if evaluatingAsFloats
29 push_double(Math.PI)
30 else
31 push_symbol(PI)
32 push_rational(1,2)
33 power()
34 return
35
36 if (isrational(p1) && MEQUAL(p1.q.a, 3) && MEQUAL(p1.q.b, 2))
37 if evaluatingAsFloats
38 push_double(Math.PI)
39 else
40 push_symbol(PI)
41 push_rational(1,2)
42 power()
43 push_rational(1,2)
44 multiply()
45 return
46
47 # if (p1->k == DOUBLE) {
48 # d = exp(lgamma(p1.d))
49 # push_double(d)
50 # return
51 # }
52
53 if (isnegativeterm(p1))
54 if evaluatingAsFloats
55 push_double(Math.PI)
56 else
57 push_symbol(PI)
58 push_integer(-1)
59 multiply()
60 if evaluatingAsFloats
61 push_double(Math.PI)
62 else
63 push_symbol(PI)
64 push(p1)
65 multiply()
66 sine()
67 push(p1)
68 multiply()
69 push(p1)
70 negate()
71 gamma()
72 multiply()
73 divide()
74 return
75
76 if (car(p1) == symbol(ADD))
77 gamma_of_sum()
78 return
79
80
81 push_symbol(GAMMA)
82 push(p1)
83 list(2)
84 return
85
86gamma_of_sum = ->
87 p3 = cdr(p1)
88 if (isrational(car(p3)) && MEQUAL(car(p3).q.a, 1) && MEQUAL(car(p3).q.b, 1))
89 push(cadr(p3))
90 push(cadr(p3))
91 gamma()
92 multiply()
93 else
94 if (isrational(car(p3)) && MEQUAL(car(p3).q.a, -1) && MEQUAL(car(p3).q.b, 1))
95 push(cadr(p3))
96 gamma()
97 push(cadr(p3))
98 push_integer(-1)
99 add()
100 divide()
101 else
102 push_symbol(GAMMA)
103 push(p1)
104 list(2)
105 return
106
107