* include/ruby/io.h (rb_io_t): new fields: writeconv,
[ruby-svn.git] / lib / cmath.rb
blob158da4175d2c4b26b4c4b7d969d8ffc81215bf9f
1 module CMath
3   include Math
5   alias exp! exp
6   alias log! log
7   alias log10! log10
8   alias sqrt! sqrt
10   alias sin! sin
11   alias cos! cos
12   alias tan! tan
14   alias sinh! sinh
15   alias cosh! cosh
16   alias tanh! tanh
18   alias asin! asin
19   alias acos! acos
20   alias atan! atan
21   alias atan2! atan2
23   alias asinh! asinh
24   alias acosh! acosh
25   alias atanh! atanh
27   def exp(z)
28     if Complex.generic?(z)
29       exp!(z)
30     else
31       Complex(exp!(z.real) * cos!(z.image),
32               exp!(z.real) * sin!(z.image))
33     end
34   end
36   def log(*args)
37     z, b = args
38     if Complex.generic?(z) and z >= 0 and (b.nil? or b >= 0)
39       log!(*args)
40     else
41       r, theta = z.polar
42       a = Complex(log!(r.abs), theta)
43       if b
44         a /= log(b)
45       end
46       a
47     end
48   end
50   def log10(z)
51     if Complex.generic?(z)
52       log10!(z)
53     else
54       log(z) / log!(10)
55     end
56   end
58   def sqrt(z)
59     if Complex.generic?(z)
60       if z >= 0
61         sqrt!(z)
62       else
63         Complex(0,sqrt!(-z))
64       end
65     else
66       if z.image < 0
67         sqrt(z.conjugate).conjugate
68       else
69         r = z.abs
70         x = z.real
71         Complex(sqrt!((r + x) / 2), sqrt!((r - x) / 2))
72       end
73     end
74   end
76   def sin(z)
77     if Complex.generic?(z)
78       sin!(z)
79     else
80       Complex(sin!(z.real) * cosh!(z.image),
81               cos!(z.real) * sinh!(z.image))
82     end
83   end
85   def cos(z)
86     if Complex.generic?(z)
87       cos!(z)
88     else
89       Complex(cos!(z.real) * cosh!(z.image),
90               -sin!(z.real) * sinh!(z.image))
91     end
92   end
94   def tan(z)
95     if Complex.generic?(z)
96       tan!(z)
97     else
98       sin(z)/cos(z)
99     end
100   end
102   def sinh(z)
103     if Complex.generic?(z)
104       sinh!(z)
105     else
106       Complex(sinh!(z.real) * cos!(z.image),
107               cosh!(z.real) * sin!(z.image))
108     end
109   end
111   def cosh(z)
112     if Complex.generic?(z)
113       cosh!(z)
114     else
115       Complex(cosh!(z.real) * cos!(z.image),
116               sinh!(z.real) * sin!(z.image))
117     end
118   end
120   def tanh(z)
121     if Complex.generic?(z)
122       tanh!(z)
123     else
124       sinh(z) / cosh(z)
125     end
126   end
128   def asin(z)
129     if Complex.generic?(z) and z >= -1 and z <= 1
130       asin!(z)
131     else
132       -1.0.im * log(1.0.im * z + sqrt(1.0 - z * z))
133     end
134   end
136   def acos(z)
137     if Complex.generic?(z) and z >= -1 and z <= 1
138       acos!(z)
139     else
140       -1.0.im * log(z + 1.0.im * sqrt(1.0 - z * z))
141     end
142   end
144   def atan(z)
145     if Complex.generic?(z)
146       atan!(z)
147     else
148       1.0.im * log((1.0.im + z) / (1.0.im - z)) / 2.0
149     end
150   end
152   def atan2(y,x)
153     if Complex.generic?(y) and Complex.generic?(x)
154       atan2!(y,x)
155     else
156       -1.0.im * log((x + 1.0.im * y) / sqrt(x * x + y * y))
157     end
158   end
160   def acosh(z)
161     if Complex.generic?(z) and z >= 1
162       acosh!(z)
163     else
164       log(z + sqrt(z * z - 1.0))
165     end
166   end
168   def asinh(z)
169     if Complex.generic?(z)
170       asinh!(z)
171     else
172       log(z + sqrt(1.0 + z * z))
173     end
174   end
176   def atanh(z)
177     if Complex.generic?(z) and z >= -1 and z <= 1
178       atanh!(z)
179     else
180       log((1.0 + z) / (1.0 - z)) / 2.0
181     end
182   end
184   module_function :exp!
185   module_function :exp
186   module_function :log!
187   module_function :log
188   module_function :log10!
189   module_function :log10
190   module_function :sqrt!
191   module_function :sqrt
193   module_function :sin!
194   module_function :sin
195   module_function :cos!
196   module_function :cos
197   module_function :tan!
198   module_function :tan
200   module_function :sinh!
201   module_function :sinh
202   module_function :cosh!
203   module_function :cosh
204   module_function :tanh!
205   module_function :tanh
207   module_function :asin!
208   module_function :asin
209   module_function :acos!
210   module_function :acos
211   module_function :atan!
212   module_function :atan
213   module_function :atan2!
214   module_function :atan2
216   module_function :asinh!
217   module_function :asinh
218   module_function :acosh!
219   module_function :acosh
220   module_function :atanh!
221   module_function :atanh