ruby-mpc 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,9 @@
1
+ === 0.0.2 2009-12-15
2
+
3
+ * 1 major enhancement:
4
+ * Support MPC 0.8.1
5
+
6
+ === 0.0.1 2009-08-13
7
+
8
+ * 1 major enhancement:
9
+ * Initial release
data/Manifest.txt ADDED
@@ -0,0 +1,21 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ ext/mpc/extconf.rb
7
+ ext/mpc/ruby_mpc.c
8
+ ext/mpc/ruby_mpc.h
9
+ ext/mpc/ruby_mpfr.h
10
+ lib/mpc/version.rb
11
+ ruby-mpc.gemspec
12
+ script/console
13
+ script/destroy
14
+ script/generate
15
+ spec/mpc/arithmetic_op_spec.rb
16
+ spec/mpc/const_spec.rb
17
+ spec/mpc/functions_spec.rb
18
+ spec/mpc/generate_complex_number.rb
19
+ spec/mpc/spec_helper.rb
20
+ spec/spec.opts
21
+ tasks/extconf.rake
data/PostInstall.txt ADDED
@@ -0,0 +1,7 @@
1
+
2
+ For more information on ruby-mpc, see http://ruby-mpc.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
data/README.rdoc ADDED
@@ -0,0 +1,48 @@
1
+ = ruby-mpc
2
+
3
+ * http://github.com/#{github_username}/#{project_name}
4
+
5
+ == DESCRIPTION:
6
+
7
+ FIX (describe your package)
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * FIX (list of features or problems)
12
+
13
+ == SYNOPSIS:
14
+
15
+ FIX (code sample of usage)
16
+
17
+ == REQUIREMENTS:
18
+
19
+ * FIX (list of requirements)
20
+
21
+ == INSTALL:
22
+
23
+ * FIX (sudo gem install, anything else)
24
+
25
+ == LICENSE:
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) 2009 FIXME full name
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+ require './lib/mpc/version.rb'
6
+
7
+ Hoe.plugin :newgem
8
+ # Hoe.plugin :website
9
+ # Hoe.plugin :cucumberfeatures
10
+
11
+ # Generate all the Rake tasks
12
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
+ $hoe = Hoe.spec 'ruby-mpc' do
14
+ self.developer 'Takayuki YAMAGUCHI', 'd@ytak.info'
15
+ self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
16
+ self.rubyforge_name = self.name # TODO this is default value
17
+ # self.extra_deps = [['activesupport','>= 2.0.2']]
18
+ self.spec_extras[:extensions] = "ext/mpc/extconf.rb"
19
+ end
20
+
21
+ require 'newgem/tasks'
22
+ Dir['tasks/**/*.rake'].each { |t| load t }
23
+
24
+ # TODO - want other tests/tasks run by default? Add them to the list
25
+ # remove_task :default
26
+ # task :default => [:spec, :features]
@@ -0,0 +1,11 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS += " -Wall"
4
+
5
+ dir_config("mpfr")
6
+ dir_config("mpc")
7
+ dir_config("gmp")
8
+ if have_header('mpfr.h') && have_library('mpfr') && have_header('mpc.h') && have_library('mpc') && have_header('gmp.h') && have_library('gmp')
9
+ create_makefile("mpc")
10
+ end
11
+
@@ -0,0 +1,968 @@
1
+ #include "ruby_mpc.h"
2
+
3
+ #define CLASS_VAL_FUNCTION_STATE "@@function_state"
4
+
5
+ static ID eqq, new, object_id;
6
+ static VALUE __mpc_class__, __mpfr_class__;
7
+
8
+ /* Default rounding mode */
9
+ mp_rnd_t __rb_mpc_default_rounding_mode = MPC_RNDNN;
10
+
11
+ void rb_mpc_extended_set_default_rounding_mode (mpc_rnd_t rnd_mode)
12
+ {
13
+ if (rnd_mode >= 0 && MPC_RND_RE(rnd_mode) < 4 && MPC_RND_IM(rnd_mode) < 4)
14
+ __rb_mpc_default_rounding_mode = rnd_mode;
15
+ }
16
+
17
+ mpc_rnd_t rb_mpc_extended_get_default_rounding_mode (void)
18
+ {
19
+ return __rb_mpc_default_rounding_mode;
20
+ }
21
+
22
+ mp_prec_t rb_mpc_get_max_prec (mpc_t x)
23
+ {
24
+ mp_prec_t precre = mpfr_get_prec(mpc_realref (x)), precim = mpfr_get_prec(mpc_imagref (x));
25
+ return (precre > precim ? precre : precim);
26
+ }
27
+
28
+ /* State of function */
29
+
30
+ void r_mpc_set_c_function_state(int num)
31
+ {
32
+ rb_cv_set(r_mpc_class, CLASS_VAL_FUNCTION_STATE, rb_ary_new3(2, INT2NUM(MPC_INEX_RE(num)), INT2NUM(MPC_INEX_IM(num))));
33
+ }
34
+
35
+ void r_mpc_set_fr_function_state(int num)
36
+ {
37
+ rb_cv_set(r_mpc_class, CLASS_VAL_FUNCTION_STATE, INT2NUM(num));
38
+ }
39
+
40
+
41
+ /* If argc equals max, convert last argument to rounding mode number. */
42
+ /* Otherwise, return defoult rounding mode number. */
43
+ mpc_rnd_t r_mpc_rnd_from_optional_argument(int min, int max, int argc, VALUE *argv)
44
+ {
45
+ mp_rnd_t rnd;
46
+ if(argc >= min && argc <= max){
47
+ if(argc == max){
48
+ rnd = r_mpc_rnd_from_value(argv[max-1]);
49
+ }else{
50
+ rnd = rb_mpc_extended_get_default_rounding_mode();
51
+ }
52
+ }else{
53
+ rb_raise(rb_eArgError, "Invalid number of arguments.");
54
+ }
55
+ return rnd;
56
+ }
57
+
58
+ /* If argc equals max, convert last argument to precision number. */
59
+ /* Otherwise, return defoult precision number. */
60
+ mpc_rnd_t r_mpc_prec_from_optional_argument(int min, int max, int argc, VALUE *argv)
61
+ {
62
+ mp_prec_t prec;
63
+ if(argc >= min && argc <= max){
64
+ if(argc == max){
65
+ prec = NUM2INT(argv[max - 1]);
66
+ }else{
67
+ prec = mpfr_get_default_prec();
68
+ }
69
+ }else{
70
+ rb_raise(rb_eArgError, "Invalid number of arguments.");
71
+ }
72
+ return prec;
73
+ }
74
+
75
+ /* min is a minimum number of arguments. */
76
+ /* max is a maximum number of arguments. */
77
+ void r_mpc_get_rnd_prec_from_optional_arguments(mpc_rnd_t *rnd, mp_prec_t *prec, int min, int max,
78
+ int argc, VALUE *argv)
79
+ {
80
+ if(argc >= min && argc <= max){
81
+ if(argc >= max - 1){
82
+ *rnd = r_mpc_rnd_from_value(argv[max - 2]);
83
+ }else{
84
+ *rnd = rb_mpc_extended_get_default_rounding_mode();
85
+ }
86
+ if(argc == max){
87
+ *prec = NUM2INT(argv[max - 1]);
88
+ }else{
89
+ *prec = mpfr_get_default_prec();
90
+ }
91
+ }else{
92
+ rb_raise(rb_eArgError, "Invalid number of arguments.");
93
+ }
94
+ }
95
+
96
+ /* Set the default rounding mode. The default rounding mode is MPC::RNDNN. */
97
+ static VALUE r_mpc_set_default_rounding_mode(VALUE self, VALUE rnd)
98
+ {
99
+ mp_rnd_t a = NUM2INT(rnd);
100
+ rb_mpc_extended_set_default_rounding_mode(a);
101
+ return INT2FIX(rb_mpc_extended_get_default_rounding_mode());
102
+ }
103
+
104
+ /* Get the default rounding mode. */
105
+ static VALUE r_mpc_get_default_rounding_mode(VALUE self)
106
+ {
107
+ return INT2NUM(rb_mpc_extended_get_default_rounding_mode());
108
+ }
109
+
110
+ /* Return function state. */
111
+ static VALUE r_mpc_get_function_state(VALUE self)
112
+ {
113
+ return rb_cv_get(r_mpc_class, CLASS_VAL_FUNCTION_STATE);
114
+ }
115
+
116
+ /* ---------- Allocation ---------- */
117
+
118
+ void r_mpc_free(void *ptr){
119
+ mpc_clear(ptr);
120
+ free(ptr);
121
+ }
122
+
123
+ static VALUE r_mpc_alloc(VALUE self)
124
+ {
125
+ MPC *ptr;
126
+ r_mpc_make_struct(self, ptr);
127
+ return self;
128
+ }
129
+
130
+ VALUE r_mpc_new_c_obj(VALUE obj)
131
+ {
132
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, obj))){
133
+ return obj;
134
+ }else{
135
+ return rb_funcall(__mpc_class__, new, 1, obj);
136
+ }
137
+ }
138
+
139
+
140
+ static void r_mpc_set_from_two_objects(MPC *ptr, VALUE real, VALUE imag, mpc_rnd_t rnd)
141
+ {
142
+ r_mpfr_set_robj(mpc_realref(ptr), real, MPC_RND_RE(rnd));
143
+ r_mpfr_set_robj(mpc_imagref(ptr), imag, MPC_RND_IM(rnd));
144
+ }
145
+
146
+ static void r_mpc_set_from_one_object(MPC *ptr, VALUE obj, mpc_rnd_t rnd)
147
+ {
148
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, obj))){
149
+ MPC *ptr_obj;
150
+ r_mpc_get_struct(ptr_obj, obj);
151
+ mpc_set(ptr, ptr_obj, rnd);
152
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, obj))){
153
+ MPFR *ptr_obj;
154
+ r_mpfr_get_struct(ptr_obj, obj);
155
+ mpc_set_fr(ptr, ptr_obj, rnd);
156
+ }else{
157
+ switch(TYPE(obj)){
158
+ case T_FLOAT:
159
+ mpc_set_d(ptr, NUM2DBL(obj), rnd);
160
+ break;
161
+ case T_FIXNUM:
162
+ mpc_set_si(ptr, FIX2LONG(obj), rnd);
163
+ break;
164
+ default:
165
+ r_mpfr_set_robj(mpc_realref(ptr), obj, MPC_RND_RE(rnd));
166
+ mpfr_set_si(mpc_imagref(ptr), 0, MPC_RND_IM(rnd));
167
+ break;
168
+ }
169
+ }
170
+ }
171
+
172
+ /* Arguments may be the following types by number. */
173
+ /* 0. none */
174
+ /* 1. MPC or array having two elements */
175
+ /* 2. real part and imaginary part*/
176
+ /* 3. real part, imaginary part, and rounding mode */
177
+ /* 4. real part, imaginary part, rounding mode and precision */
178
+ static VALUE r_mpc_initialize(int argc, VALUE *argv, VALUE self)
179
+ {
180
+ MPC *ptr;
181
+ r_mpc_get_struct(ptr, self);
182
+ switch(argc){
183
+ case 0:
184
+ mpc_init2(ptr, mpfr_get_default_prec());
185
+ break;
186
+ case 1:
187
+ mpc_init2(ptr, mpfr_get_default_prec());
188
+ r_mpc_set_from_one_object(ptr, argv[0], rb_mpc_extended_get_default_rounding_mode());
189
+ break;
190
+ case 2:
191
+ mpc_init2(ptr, mpfr_get_default_prec());
192
+ r_mpc_set_from_two_objects(ptr, argv[0], argv[1], rb_mpc_extended_get_default_rounding_mode());
193
+ break;
194
+ case 3:
195
+ mpc_init2(ptr, mpfr_get_default_prec());
196
+ r_mpc_set_from_two_objects(ptr, argv[0], argv[1], r_mpc_rnd_from_value(argv[2]));
197
+ break;
198
+ case 4:
199
+ mpc_init2(ptr, NUM2INT(argv[3]));
200
+ r_mpc_set_from_two_objects(ptr, argv[0], argv[1], r_mpc_rnd_from_value(argv[2]));
201
+ break;
202
+ default:
203
+ rb_raise(rb_eArgError, "Invalid number of arguments.");
204
+ break;
205
+ }
206
+ return Qtrue;
207
+ }
208
+
209
+ static VALUE r_mpc_initialize_copy(VALUE self, VALUE other)
210
+ {
211
+ MPC *ptr_self, *ptr_other;
212
+ r_mpc_get_struct(ptr_self, self);
213
+ r_mpc_get_struct(ptr_other, other);
214
+ mpc_init2(ptr_self, rb_mpc_get_max_prec(ptr_other));
215
+ mpc_set(ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
216
+ return Qtrue;
217
+ }
218
+
219
+ /* Return array which have MPC instance converted to from p1 and self. */
220
+ static VALUE r_mpc_coerce(VALUE self, VALUE other)
221
+ {
222
+ VALUE val_other;
223
+ MPC *ptr_self, *ptr_other;
224
+ r_mpc_get_struct(ptr_self, self);
225
+ r_mpc_make_struct_init2(val_other, ptr_other, rb_mpc_get_max_prec(ptr_self));
226
+ r_mpc_set_from_one_object(ptr_other, other, rb_mpc_extended_get_default_rounding_mode());
227
+ return rb_ary_new3(2, val_other, self);
228
+ }
229
+
230
+ /* String */
231
+
232
+ static VALUE r_mpc_inspect(VALUE self)
233
+ {
234
+ MPC *ptr_s;
235
+ r_mpc_get_struct(ptr_s, self);
236
+ char *ret_str;
237
+ mpfr_asprintf(&ret_str, "#<MPC:%lx,['%.Re','%.Re'],[%d,%d]>",
238
+ NUM2LONG(rb_funcall(self, object_id, 0)), mpc_realref (ptr_s), mpc_imagref (ptr_s),
239
+ mpfr_get_prec(mpc_realref (ptr_s)), mpfr_get_prec(mpc_imagref (ptr_s)));
240
+ VALUE ret_val = rb_str_new2(ret_str);
241
+ mpfr_free_str(ret_str);
242
+ return ret_val;
243
+ }
244
+
245
+
246
+ /* Projection and Decomposing Functions */
247
+
248
+ /* Return the real part. */
249
+ static VALUE r_mpc_real (VALUE self)
250
+ {
251
+ MPC *ptr_self;
252
+ r_mpc_get_struct(ptr_self, self);
253
+ VALUE ret_val;
254
+ MPFR *ptr_ret;
255
+ r_mpfr_make_struct_init2(ret_val, ptr_ret, mpfr_get_prec(mpc_realref(ptr_self)));
256
+ r_mpc_set_fr_function_state(mpc_real(ptr_ret, ptr_self, MPC_RNDNN));
257
+ return ret_val;
258
+ }
259
+
260
+ /* Return the imaginary part. */
261
+ static VALUE r_mpc_imag (VALUE self)
262
+ {
263
+ MPC *ptr_self;
264
+ r_mpc_get_struct(ptr_self, self);
265
+ VALUE ret_val;
266
+ MPFR *ptr_ret;
267
+ r_mpfr_make_struct_init2(ret_val, ptr_ret, mpfr_get_prec(mpc_imagref(ptr_self)));
268
+ r_mpc_set_fr_function_state(mpc_imag(ptr_ret, ptr_self, MPC_RNDNN));
269
+ return ret_val;
270
+ }
271
+
272
+ /* Return the argument. */
273
+ static VALUE r_mpc_arg (int argc, VALUE *argv, VALUE self)
274
+ {
275
+ mpc_rnd_t rnd;
276
+ mp_prec_t prec;
277
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 0, 2, argc, argv);
278
+ MPC *ptr_self;
279
+ r_mpc_get_struct(ptr_self, self);
280
+ VALUE ret_val;
281
+ MPFR *ptr_ret;
282
+ r_mpfr_make_struct_init2(ret_val, ptr_ret, prec);
283
+ r_mpc_set_fr_function_state(mpc_arg(ptr_ret, ptr_self, rnd));
284
+ return ret_val;
285
+ }
286
+
287
+ /* Return the projection onto the Riemann sphere. */
288
+ static VALUE r_mpc_proj (int argc, VALUE *argv, VALUE self)
289
+ {
290
+ mpc_rnd_t rnd;
291
+ mp_prec_t prec;
292
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 0, 2, argc, argv);
293
+ MPC *ptr_self;
294
+ r_mpc_get_struct(ptr_self, self);
295
+ VALUE ret_val;
296
+ MPC *ptr_ret;
297
+ r_mpc_make_struct_init2(ret_val, ptr_ret, prec);
298
+ r_mpc_set_c_function_state(mpc_proj(ptr_ret, ptr_self, rnd));
299
+ return ret_val;
300
+ }
301
+
302
+ /* Basic Arithmetic Functions */
303
+ static VALUE r_mpc_add(VALUE self, VALUE other)
304
+ {
305
+ MPC *ptr_self, *ptr_return;
306
+ VALUE val_ret;
307
+ r_mpc_get_struct(ptr_self, self);
308
+ r_mpc_make_struct_init(val_ret, ptr_return);
309
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, other))){
310
+ MPC *ptr_other;
311
+ r_mpc_get_struct(ptr_other, other);
312
+ mpc_add(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
313
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, other))){
314
+ MPFR *ptr_other;
315
+ r_mpfr_get_struct(ptr_other, other);
316
+ mpc_add_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
317
+ }else{
318
+ MPFR *ptr_other;
319
+ r_mpfr_get_struct(ptr_other, rb_funcall(__mpc_class__, new, 1, other));
320
+ mpc_add_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
321
+ }
322
+ return val_ret;
323
+ }
324
+
325
+ static VALUE r_mpc_sub(VALUE self, VALUE other)
326
+ {
327
+ MPC *ptr_self, *ptr_return;
328
+ VALUE val_ret;
329
+ r_mpc_get_struct(ptr_self, self);
330
+ r_mpc_make_struct_init(val_ret, ptr_return);
331
+
332
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, other))){
333
+ MPC *ptr_other;
334
+ r_mpc_get_struct(ptr_other, other);
335
+ mpc_sub(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
336
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, other))){
337
+ MPFR *ptr_other;
338
+ r_mpfr_get_struct(ptr_other, other);
339
+ mpc_sub_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
340
+ }else{
341
+ MPFR *ptr_other;
342
+ r_mpfr_get_struct(ptr_other, rb_funcall(__mpc_class__, new, 1, other));
343
+ mpc_sub_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
344
+ }
345
+ return val_ret;
346
+ }
347
+
348
+ static VALUE r_mpc_mul(VALUE self, VALUE other)
349
+ {
350
+ MPC *ptr_self, *ptr_return;
351
+ VALUE val_ret;
352
+ r_mpc_get_struct(ptr_self, self);
353
+ r_mpc_make_struct_init(val_ret, ptr_return);
354
+
355
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, other))){
356
+ MPC *ptr_other;
357
+ r_mpc_get_struct(ptr_other, other);
358
+ mpc_mul(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
359
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, other))){
360
+ MPFR *ptr_other;
361
+ r_mpfr_get_struct(ptr_other, other);
362
+ mpc_mul_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
363
+ }else{
364
+ MPFR *ptr_other;
365
+ r_mpfr_get_struct(ptr_other, rb_funcall(__mpc_class__, new, 1, other));
366
+ mpc_mul_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
367
+ }
368
+ return val_ret;
369
+ }
370
+
371
+
372
+ static VALUE r_mpc_div(VALUE self, VALUE other)
373
+ {
374
+ MPC *ptr_self, *ptr_return;
375
+ VALUE val_ret;
376
+ r_mpc_get_struct(ptr_self, self);
377
+ r_mpc_make_struct_init(val_ret, ptr_return);
378
+
379
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, other))){
380
+ MPC *ptr_other;
381
+ r_mpc_get_struct(ptr_other, other);
382
+ mpc_div(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
383
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, other))){
384
+ MPFR *ptr_other;
385
+ r_mpfr_get_struct(ptr_other, other);
386
+ mpc_div_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
387
+ }else{
388
+ MPFR *ptr_other;
389
+ r_mpfr_get_struct(ptr_other, rb_funcall(__mpc_class__, new, 1, other));
390
+ mpc_div_fr(ptr_return, ptr_self, ptr_other, rb_mpc_extended_get_default_rounding_mode());
391
+ }
392
+ return val_ret;
393
+ }
394
+
395
+ static VALUE r_mpc_mul_i (int argc, VALUE *argv, VALUE self)
396
+ {
397
+ mpc_rnd_t rnd;
398
+ mp_prec_t prec;
399
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
400
+ MPC *ptr_self, *ptr_return;
401
+ VALUE val_ret;
402
+ r_mpc_get_struct(ptr_self, self);
403
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
404
+ r_mpc_set_c_function_state(mpc_mul_i(ptr_return, ptr_self, NUM2INT(argv[0]), rnd));
405
+ return val_ret;
406
+ }
407
+
408
+ static VALUE r_mpc_neg (int argc, VALUE *argv, VALUE self)
409
+ {
410
+ mpc_rnd_t rnd;
411
+ mp_prec_t prec;
412
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 0, 2, argc, argv);
413
+ MPC *ptr_self, *ptr_return;
414
+ VALUE val_ret;
415
+ r_mpc_get_struct(ptr_self, self);
416
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
417
+ r_mpc_set_c_function_state(mpc_neg(ptr_return, ptr_self, rnd));
418
+ return val_ret;
419
+ }
420
+
421
+ static VALUE r_mpc_conj (int argc, VALUE *argv, VALUE self)
422
+ {
423
+ mpc_rnd_t rnd;
424
+ mp_prec_t prec;
425
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 0, 2, argc, argv);
426
+ MPC *ptr_self, *ptr_return;
427
+ VALUE val_ret;
428
+ r_mpc_get_struct(ptr_self, self);
429
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
430
+ r_mpc_set_c_function_state(mpc_conj(ptr_return, ptr_self, rnd));
431
+ return val_ret;
432
+ }
433
+
434
+ static VALUE r_mpc_abs (int argc, VALUE *argv, VALUE self)
435
+ {
436
+ mpc_rnd_t rnd;
437
+ mp_prec_t prec;
438
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 0, 2, argc, argv);
439
+ MPC *ptr_self;
440
+ MPFR *ptr_return;
441
+ VALUE val_ret;
442
+ r_mpc_get_struct(ptr_self, self);
443
+ r_mpfr_make_struct_init2(val_ret, ptr_return, prec);
444
+ r_mpc_set_fr_function_state(mpc_abs(ptr_return, ptr_self, rnd));
445
+ return val_ret;
446
+ }
447
+
448
+ static VALUE r_mpc_norm (int argc, VALUE *argv, VALUE self)
449
+ {
450
+ mpc_rnd_t rnd;
451
+ mp_prec_t prec;
452
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 0, 2, argc, argv);
453
+ MPC *ptr_self;
454
+ MPFR *ptr_return;
455
+ VALUE val_ret;
456
+ r_mpc_get_struct(ptr_self, self);
457
+ r_mpfr_make_struct_init2(val_ret, ptr_return, prec);
458
+ r_mpc_set_fr_function_state(mpc_norm(ptr_return, ptr_self, rnd));
459
+ return val_ret;
460
+ }
461
+
462
+ /* module function */
463
+ static VALUE r_mpc_math_add(int argc, VALUE *argv, VALUE self)
464
+ {
465
+ mp_rnd_t rnd;
466
+ mp_prec_t prec;
467
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
468
+ MPC *ptr_arg1, *ptr_return;
469
+ VALUE val_ret;
470
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
471
+ r_mpc_get_struct(ptr_arg1, tmp_argv0);
472
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
473
+
474
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, argv[1]))){
475
+ MPC *ptr_arg2;
476
+ r_mpc_get_struct(ptr_arg2, argv[1]);
477
+ mpc_add(ptr_return, ptr_arg1, ptr_arg2, rnd);
478
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, argv[1]))){
479
+ MPFR *ptr_arg2;
480
+ r_mpfr_get_struct(ptr_arg2, argv[1]);
481
+ r_mpc_set_c_function_state(mpc_add_fr(ptr_return, ptr_arg1, ptr_arg2, rnd));
482
+ }else if(TYPE(argv[1]) == T_FIXNUM){
483
+ mpc_add_si(ptr_return, ptr_arg1, FIX2LONG(argv[1]), rnd);
484
+ }else{
485
+ MPC *ptr_arg2;
486
+ r_mpc_get_struct(ptr_arg2, rb_funcall(__mpc_class__, new, 1, argv[1]));
487
+ mpc_add(ptr_return, ptr_arg1, ptr_arg2, rnd);
488
+ }
489
+ return val_ret;
490
+ }
491
+
492
+ static VALUE r_mpc_math_sub(int argc, VALUE *argv, VALUE self)
493
+ {
494
+ mp_rnd_t rnd;
495
+ mp_prec_t prec;
496
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
497
+ MPC *ptr_arg1, *ptr_return;
498
+ VALUE val_ret;
499
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
500
+ r_mpc_get_struct(ptr_arg1, tmp_argv0);
501
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
502
+
503
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, argv[1]))){
504
+ MPC *ptr_arg2;
505
+ r_mpc_get_struct(ptr_arg2, argv[1]);
506
+ mpc_sub(ptr_return, ptr_arg1, ptr_arg2, rnd);
507
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, argv[1]))){
508
+ MPFR *ptr_arg2;
509
+ r_mpfr_get_struct(ptr_arg2, argv[1]);
510
+ r_mpc_set_c_function_state(mpc_sub_fr(ptr_return, ptr_arg1, ptr_arg2, rnd));
511
+ }else if(TYPE(argv[1]) == T_FIXNUM){
512
+ int other = FIX2LONG(argv[1]);
513
+ if (other >= 0) {
514
+ mpc_sub_ui(ptr_return, ptr_arg1, other, rnd);
515
+ } else {
516
+ mpc_add_ui(ptr_return, ptr_arg1, -other, rnd);
517
+ }
518
+ }else{
519
+ MPC *ptr_arg2;
520
+ r_mpc_get_struct(ptr_arg2, rb_funcall(__mpc_class__, new, 1, argv[1]));
521
+ mpc_sub(ptr_return, ptr_arg1, ptr_arg2, rnd);
522
+ }
523
+ return val_ret;
524
+ }
525
+
526
+ static VALUE r_mpc_math_mul(int argc, VALUE *argv, VALUE self)
527
+ {
528
+ mp_rnd_t rnd;
529
+ mp_prec_t prec;
530
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
531
+ MPC *ptr_arg1, *ptr_return;
532
+ VALUE val_ret;
533
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
534
+ r_mpc_get_struct(ptr_arg1, tmp_argv0);
535
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
536
+
537
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, argv[1]))){
538
+ MPC *ptr_arg2;
539
+ r_mpc_get_struct(ptr_arg2, argv[1]);
540
+ mpc_mul(ptr_return, ptr_arg1, ptr_arg2, rnd);
541
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, argv[1]))){
542
+ MPFR *ptr_arg2;
543
+ r_mpfr_get_struct(ptr_arg2, argv[1]);
544
+ r_mpc_set_c_function_state(mpc_mul_fr(ptr_return, ptr_arg1, ptr_arg2, rnd));
545
+ }else if(TYPE(argv[1]) == T_FIXNUM){
546
+ mpc_mul_si(ptr_return, ptr_arg1, FIX2LONG(argv[1]), rnd);
547
+ }else{
548
+ MPC *ptr_arg2;
549
+ r_mpc_get_struct(ptr_arg2, rb_funcall(__mpc_class__, new, 1, argv[1]));
550
+ mpc_mul(ptr_return, ptr_arg1, ptr_arg2, rnd);
551
+ }
552
+ return val_ret;
553
+ }
554
+
555
+ static VALUE r_mpc_math_div(int argc, VALUE *argv, VALUE self)
556
+ {
557
+ mp_rnd_t rnd;
558
+ mp_prec_t prec;
559
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
560
+ MPC *ptr_arg1, *ptr_return;
561
+ VALUE val_ret;
562
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
563
+ r_mpc_get_struct(ptr_arg1, tmp_argv0);
564
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
565
+
566
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, argv[1]))){
567
+ MPC *ptr_arg2;
568
+ r_mpc_get_struct(ptr_arg2, argv[1]);
569
+ mpc_div(ptr_return, ptr_arg1, ptr_arg2, rnd);
570
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, argv[1]))){
571
+ MPFR *ptr_arg2;
572
+ r_mpfr_get_struct(ptr_arg2, argv[1]);
573
+ r_mpc_set_c_function_state(mpc_div_fr(ptr_return, ptr_arg1, ptr_arg2, rnd));
574
+ }else{
575
+ MPC *ptr_arg2;
576
+ r_mpc_get_struct(ptr_arg2, rb_funcall(__mpc_class__, new, 1, argv[1]));
577
+ mpc_div(ptr_return, ptr_arg1, ptr_arg2, rnd);
578
+ }
579
+ return val_ret;
580
+ }
581
+
582
+ static VALUE r_mpc_math_mul_2exp (int argc, VALUE *argv, VALUE self)
583
+ {
584
+ mpc_rnd_t rnd;
585
+ mp_prec_t prec;
586
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
587
+ MPC *ptr_arg, *ptr_return;
588
+ VALUE val_ret;
589
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
590
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
591
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
592
+ r_mpc_set_c_function_state(mpc_mul_2exp(ptr_return, ptr_arg, NUM2LONG(argv[1]), rnd));
593
+ return val_ret;
594
+ }
595
+
596
+ static VALUE r_mpc_math_div_2exp (int argc, VALUE *argv, VALUE self)
597
+ {
598
+ mpc_rnd_t rnd;
599
+ mp_prec_t prec;
600
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
601
+ MPC *ptr_arg, *ptr_return;
602
+ VALUE val_ret;
603
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
604
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
605
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
606
+ r_mpc_set_c_function_state(mpc_div_2exp(ptr_return, ptr_arg, NUM2LONG(argv[1]), rnd));
607
+ return val_ret;
608
+ }
609
+
610
+
611
+ static VALUE r_mpc_math_sqr (int argc, VALUE *argv, VALUE self)
612
+ {
613
+ mpc_rnd_t rnd;
614
+ mp_prec_t prec;
615
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
616
+ MPC *ptr_arg, *ptr_return;
617
+ VALUE val_ret;
618
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
619
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
620
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
621
+ r_mpc_set_c_function_state(mpc_sqr(ptr_return, ptr_arg, rnd));
622
+ return val_ret;
623
+ }
624
+
625
+ static VALUE r_mpc_math_sqrt (int argc, VALUE *argv, VALUE self)
626
+ {
627
+ mpc_rnd_t rnd;
628
+ mp_prec_t prec;
629
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
630
+ MPC *ptr_arg, *ptr_return;
631
+ VALUE val_ret;
632
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
633
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
634
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
635
+ r_mpc_set_c_function_state(mpc_sqrt(ptr_return, ptr_arg, rnd));
636
+ return val_ret;
637
+ }
638
+
639
+ static VALUE r_mpc_math_pow(int argc, VALUE *argv, VALUE self)
640
+ {
641
+ mp_rnd_t rnd;
642
+ mp_prec_t prec;
643
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 2, 4, argc, argv);
644
+ MPC *ptr_arg1, *ptr_return;
645
+ VALUE val_ret;
646
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
647
+ r_mpc_get_struct(ptr_arg1, tmp_argv0);
648
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
649
+
650
+ if(RTEST(rb_funcall(__mpc_class__, eqq, 1, argv[1]))){
651
+ MPC *ptr_arg2;
652
+ r_mpc_get_struct(ptr_arg2, argv[1]);
653
+ mpc_pow(ptr_return, ptr_arg1, ptr_arg2, rnd);
654
+ }else if(RTEST(rb_funcall(__mpfr_class__, eqq, 1, argv[1]))){
655
+ MPFR *ptr_arg2;
656
+ r_mpfr_get_struct(ptr_arg2, argv[1]);
657
+ r_mpc_set_c_function_state(mpc_pow_fr(ptr_return, ptr_arg1, ptr_arg2, rnd));
658
+ }else if(TYPE(argv[1]) == T_FLOAT){
659
+ mpc_pow_d(ptr_return, ptr_arg1, NUM2DBL(argv[1]), rnd);
660
+ }else if(TYPE(argv[1]) == T_FIXNUM){
661
+ mpc_pow_si(ptr_return, ptr_arg1, FIX2LONG(argv[1]), rnd);
662
+ }else{
663
+ MPC *ptr_arg2;
664
+ r_mpc_get_struct(ptr_arg2, rb_funcall(__mpc_class__, new, 1, argv[1]));
665
+ mpc_pow(ptr_return, ptr_arg1, ptr_arg2, rnd);
666
+ }
667
+ return val_ret;
668
+ }
669
+
670
+
671
+
672
+ static VALUE r_mpc_math_exp (int argc, VALUE *argv, VALUE self)
673
+ {
674
+ mpc_rnd_t rnd;
675
+ mp_prec_t prec;
676
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
677
+ MPC *ptr_arg, *ptr_return;
678
+ VALUE val_ret;
679
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
680
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
681
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
682
+ r_mpc_set_c_function_state(mpc_exp(ptr_return, ptr_arg, rnd));
683
+ return val_ret;
684
+ }
685
+
686
+ static VALUE r_mpc_math_log (int argc, VALUE *argv, VALUE self)
687
+ {
688
+ mpc_rnd_t rnd;
689
+ mp_prec_t prec;
690
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
691
+ MPC *ptr_arg, *ptr_return;
692
+ VALUE val_ret;
693
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
694
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
695
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
696
+ r_mpc_set_c_function_state(mpc_log(ptr_return, ptr_arg, rnd));
697
+ return val_ret;
698
+ }
699
+
700
+ static VALUE r_mpc_math_sin (int argc, VALUE *argv, VALUE self)
701
+ {
702
+ mpc_rnd_t rnd;
703
+ mp_prec_t prec;
704
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
705
+ MPC *ptr_arg, *ptr_return;
706
+ VALUE val_ret;
707
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
708
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
709
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
710
+ r_mpc_set_c_function_state(mpc_sin(ptr_return, ptr_arg, rnd));
711
+ return val_ret;
712
+ }
713
+
714
+ static VALUE r_mpc_math_cos (int argc, VALUE *argv, VALUE self)
715
+ {
716
+ mpc_rnd_t rnd;
717
+ mp_prec_t prec;
718
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
719
+ MPC *ptr_arg, *ptr_return;
720
+ VALUE val_ret;
721
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
722
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
723
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
724
+ r_mpc_set_c_function_state(mpc_cos(ptr_return, ptr_arg, rnd));
725
+ return val_ret;
726
+ }
727
+
728
+ static VALUE r_mpc_math_tan (int argc, VALUE *argv, VALUE self)
729
+ {
730
+ mpc_rnd_t rnd;
731
+ mp_prec_t prec;
732
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
733
+ MPC *ptr_arg, *ptr_return;
734
+ VALUE val_ret;
735
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
736
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
737
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
738
+ r_mpc_set_c_function_state(mpc_tan(ptr_return, ptr_arg, rnd));
739
+ return val_ret;
740
+ }
741
+
742
+ static VALUE r_mpc_math_sinh (int argc, VALUE *argv, VALUE self)
743
+ {
744
+ mpc_rnd_t rnd;
745
+ mp_prec_t prec;
746
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
747
+ MPC *ptr_arg, *ptr_return;
748
+ VALUE val_ret;
749
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
750
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
751
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
752
+ r_mpc_set_c_function_state(mpc_sinh(ptr_return, ptr_arg, rnd));
753
+ return val_ret;
754
+ }
755
+
756
+ static VALUE r_mpc_math_cosh (int argc, VALUE *argv, VALUE self)
757
+ {
758
+ mpc_rnd_t rnd;
759
+ mp_prec_t prec;
760
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
761
+ MPC *ptr_arg, *ptr_return;
762
+ VALUE val_ret;
763
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
764
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
765
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
766
+ r_mpc_set_c_function_state(mpc_cosh(ptr_return, ptr_arg, rnd));
767
+ return val_ret;
768
+ }
769
+
770
+ static VALUE r_mpc_math_tanh (int argc, VALUE *argv, VALUE self)
771
+ {
772
+ mpc_rnd_t rnd;
773
+ mp_prec_t prec;
774
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
775
+ MPC *ptr_arg, *ptr_return;
776
+ VALUE val_ret;
777
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
778
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
779
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
780
+ r_mpc_set_c_function_state(mpc_tanh(ptr_return, ptr_arg, rnd));
781
+ return val_ret;
782
+ }
783
+
784
+ static VALUE r_mpc_math_asin (int argc, VALUE *argv, VALUE self)
785
+ {
786
+ mpc_rnd_t rnd;
787
+ mp_prec_t prec;
788
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
789
+ MPC *ptr_arg, *ptr_return;
790
+ VALUE val_ret;
791
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
792
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
793
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
794
+ r_mpc_set_c_function_state(mpc_asin(ptr_return, ptr_arg, rnd));
795
+ return val_ret;
796
+ }
797
+
798
+ static VALUE r_mpc_math_acos (int argc, VALUE *argv, VALUE self)
799
+ {
800
+ mpc_rnd_t rnd;
801
+ mp_prec_t prec;
802
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
803
+ MPC *ptr_arg, *ptr_return;
804
+ VALUE val_ret;
805
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
806
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
807
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
808
+ r_mpc_set_c_function_state(mpc_acos(ptr_return, ptr_arg, rnd));
809
+ return val_ret;
810
+ }
811
+
812
+ static VALUE r_mpc_math_atan (int argc, VALUE *argv, VALUE self)
813
+ {
814
+ mpc_rnd_t rnd;
815
+ mp_prec_t prec;
816
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
817
+ MPC *ptr_arg, *ptr_return;
818
+ VALUE val_ret;
819
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
820
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
821
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
822
+ r_mpc_set_c_function_state(mpc_atan(ptr_return, ptr_arg, rnd));
823
+ return val_ret;
824
+ }
825
+
826
+ static VALUE r_mpc_math_asinh (int argc, VALUE *argv, VALUE self)
827
+ {
828
+ mpc_rnd_t rnd;
829
+ mp_prec_t prec;
830
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
831
+ MPC *ptr_arg, *ptr_return;
832
+ VALUE val_ret;
833
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
834
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
835
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
836
+ r_mpc_set_c_function_state(mpc_asinh(ptr_return, ptr_arg, rnd));
837
+ return val_ret;
838
+ }
839
+
840
+ static VALUE r_mpc_math_acosh (int argc, VALUE *argv, VALUE self)
841
+ {
842
+ mpc_rnd_t rnd;
843
+ mp_prec_t prec;
844
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
845
+ MPC *ptr_arg, *ptr_return;
846
+ VALUE val_ret;
847
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
848
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
849
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
850
+ r_mpc_set_c_function_state(mpc_acosh(ptr_return, ptr_arg, rnd));
851
+ return val_ret;
852
+ }
853
+
854
+ static VALUE r_mpc_math_atanh (int argc, VALUE *argv, VALUE self)
855
+ {
856
+ mpc_rnd_t rnd;
857
+ mp_prec_t prec;
858
+ r_mpc_get_rnd_prec_from_optional_arguments(&rnd, &prec, 1, 3, argc, argv);
859
+ MPC *ptr_arg, *ptr_return;
860
+ VALUE val_ret;
861
+ volatile VALUE tmp_argv0 = r_mpc_new_c_obj(argv[0]);
862
+ r_mpc_get_struct(ptr_arg, tmp_argv0);
863
+ r_mpc_make_struct_init2(val_ret, ptr_return, prec);
864
+ r_mpc_set_c_function_state(mpc_atanh(ptr_return, ptr_arg, rnd));
865
+ return val_ret;
866
+ }
867
+
868
+
869
+ void Init_mpc(){
870
+ r_mpc_class = rb_define_class("MPC", rb_cNumeric);
871
+
872
+ rb_define_singleton_method(r_mpc_class, "set_default_rounding_mode", r_mpc_set_default_rounding_mode, 1);
873
+ rb_define_singleton_method(r_mpc_class, "get_default_rounding_mode", r_mpc_get_default_rounding_mode, 0);
874
+
875
+ rb_define_const(r_mpc_class, "RNDNN", INT2NUM(MPC_RNDNN));
876
+ rb_define_const(r_mpc_class, "RNDNZ", INT2NUM(MPC_RNDNZ));
877
+ rb_define_const(r_mpc_class, "RNDNU", INT2NUM(MPC_RNDNU));
878
+ rb_define_const(r_mpc_class, "RNDND", INT2NUM(MPC_RNDND));
879
+ rb_define_const(r_mpc_class, "RNDZN", INT2NUM(MPC_RNDZN));
880
+ rb_define_const(r_mpc_class, "RNDZZ", INT2NUM(MPC_RNDZZ));
881
+ rb_define_const(r_mpc_class, "RNDZU", INT2NUM(MPC_RNDZU));
882
+ rb_define_const(r_mpc_class, "RNDZD", INT2NUM(MPC_RNDZD));
883
+ rb_define_const(r_mpc_class, "RNDUN", INT2NUM(MPC_RNDUN));
884
+ rb_define_const(r_mpc_class, "RNDUZ", INT2NUM(MPC_RNDUZ));
885
+ rb_define_const(r_mpc_class, "RNDUU", INT2NUM(MPC_RNDUU));
886
+ rb_define_const(r_mpc_class, "RNDUD", INT2NUM(MPC_RNDUD));
887
+ rb_define_const(r_mpc_class, "RNDDN", INT2NUM(MPC_RNDDN));
888
+ rb_define_const(r_mpc_class, "RNDDZ", INT2NUM(MPC_RNDDZ));
889
+ rb_define_const(r_mpc_class, "RNDDU", INT2NUM(MPC_RNDDU));
890
+ rb_define_const(r_mpc_class, "RNDDD", INT2NUM(MPC_RNDDD));
891
+
892
+ rb_define_const(r_mpc_class, "VERSION_MAJOR", INT2NUM(MPC_VERSION_MAJOR));
893
+ rb_define_const(r_mpc_class, "VERSION_MINOR", INT2NUM(MPC_VERSION_MINOR));
894
+ rb_define_const(r_mpc_class, "VERSION_PATCHLEVEL", INT2NUM(MPC_VERSION_PATCHLEVEL));
895
+ rb_define_const(r_mpc_class, "VERSION_STRING", rb_str_new2(MPC_VERSION_STRING));
896
+
897
+
898
+
899
+ rb_define_singleton_method(r_mpc_class, "get_function_state", r_mpc_get_function_state, 0);
900
+
901
+
902
+ rb_define_alloc_func(r_mpc_class, r_mpc_alloc);
903
+
904
+ rb_define_private_method(r_mpc_class, "initialize", r_mpc_initialize, -1);
905
+ rb_define_private_method(r_mpc_class, "initialize_copy", r_mpc_initialize_copy, 1);
906
+
907
+ rb_define_method(r_mpc_class, "coerce", r_mpc_coerce, 1);
908
+
909
+ rb_define_method(r_mpc_class, "inspect", r_mpc_inspect, 0);
910
+
911
+
912
+ rb_define_method(r_mpc_class, "real", r_mpc_real, 0);
913
+ rb_define_method(r_mpc_class, "imag", r_mpc_imag, 0);
914
+ rb_define_method(r_mpc_class, "arg", r_mpc_arg, -1);
915
+ rb_define_method(r_mpc_class, "proj", r_mpc_proj, -1);
916
+
917
+
918
+
919
+
920
+ /* Basic Arithmetic Functions */
921
+ rb_define_method(r_mpc_class, "+", r_mpc_add, 1);
922
+ rb_define_method(r_mpc_class, "-", r_mpc_sub, 1);
923
+ rb_define_method(r_mpc_class, "*", r_mpc_mul, 1);
924
+ rb_define_method(r_mpc_class, "/", r_mpc_div, 1);
925
+ rb_define_method(r_mpc_class, "mul_i", r_mpc_mul_i, -1);
926
+ rb_define_method(r_mpc_class, "neg", r_mpc_neg, -1);
927
+ rb_define_method(r_mpc_class, "conj", r_mpc_conj, -1);
928
+ rb_define_method(r_mpc_class, "abs", r_mpc_abs, -1);
929
+ rb_define_method(r_mpc_class, "norm", r_mpc_norm, -1);
930
+
931
+
932
+
933
+ r_mpc_math = rb_define_module_under(r_mpc_class, "Math");
934
+
935
+ rb_define_module_function(r_mpc_math, "add", r_mpc_math_add, -1);
936
+ rb_define_module_function(r_mpc_math, "sub", r_mpc_math_sub, -1);
937
+ rb_define_module_function(r_mpc_math, "mul", r_mpc_math_mul, -1);
938
+ rb_define_module_function(r_mpc_math, "div", r_mpc_math_div, -1);
939
+ rb_define_module_function(r_mpc_math, "mul_2exp", r_mpc_math_mul_2exp, -1);
940
+ rb_define_module_function(r_mpc_math, "div_2exp", r_mpc_math_div_2exp, -1);
941
+
942
+ rb_define_module_function(r_mpc_math, "sqr", r_mpc_math_sqr, -1);
943
+ rb_define_module_function(r_mpc_math, "sqrt", r_mpc_math_sqrt, -1);
944
+ rb_define_module_function(r_mpc_math, "pow", r_mpc_math_pow, -1);
945
+ rb_define_module_function(r_mpc_math, "exp", r_mpc_math_exp, -1);
946
+ rb_define_module_function(r_mpc_math, "log", r_mpc_math_log, -1);
947
+ rb_define_module_function(r_mpc_math, "sin", r_mpc_math_sin, -1);
948
+ rb_define_module_function(r_mpc_math, "cos", r_mpc_math_cos, -1);
949
+ rb_define_module_function(r_mpc_math, "tan", r_mpc_math_tan, -1);
950
+ rb_define_module_function(r_mpc_math, "sinh", r_mpc_math_sinh, -1);
951
+ rb_define_module_function(r_mpc_math, "cosh", r_mpc_math_cosh, -1);
952
+ rb_define_module_function(r_mpc_math, "tanh", r_mpc_math_tanh, -1);
953
+ rb_define_module_function(r_mpc_math, "asin", r_mpc_math_asin, -1);
954
+ rb_define_module_function(r_mpc_math, "acos", r_mpc_math_acos, -1);
955
+ rb_define_module_function(r_mpc_math, "atan", r_mpc_math_atan, -1);
956
+ rb_define_module_function(r_mpc_math, "asinh", r_mpc_math_asinh, -1);
957
+ rb_define_module_function(r_mpc_math, "acosh", r_mpc_math_acosh, -1);
958
+ rb_define_module_function(r_mpc_math, "atanh", r_mpc_math_atanh, -1);
959
+
960
+ eqq = rb_intern("===");
961
+ new = rb_intern("new");
962
+ object_id = rb_intern("object_id");
963
+ __mpc_class__ = rb_eval_string("MPC");
964
+ __mpfr_class__ = rb_eval_string("MPFR");
965
+
966
+
967
+ }
968
+