ruby-mpc 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +9 -0
- data/Manifest.txt +21 -0
- data/PostInstall.txt +7 -0
- data/README.rdoc +48 -0
- data/Rakefile +26 -0
- data/ext/mpc/extconf.rb +11 -0
- data/ext/mpc/ruby_mpc.c +968 -0
- data/ext/mpc/ruby_mpc.h +43 -0
- data/ext/mpc/ruby_mpfr.h +38 -0
- data/lib/mpc/version.rb +3 -0
- data/ruby-mpc.gemspec +35 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/mpc/arithmetic_op_spec.rb +30 -0
- data/spec/mpc/const_spec.rb +23 -0
- data/spec/mpc/functions_spec.rb +30 -0
- data/spec/mpc/generate_complex_number.rb +29 -0
- data/spec/mpc/spec_helper.rb +16 -0
- data/spec/spec.opts +1 -0
- data/tasks/extconf.rake +36 -0
- metadata +89 -0
data/History.txt
ADDED
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
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]
|
data/ext/mpc/extconf.rb
ADDED
@@ -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
|
+
|
data/ext/mpc/ruby_mpc.c
ADDED
@@ -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
|
+
|