srawlins-gmp 0.1.4.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/README.rdoc +21 -18
  2. data/ext/gmp.c +17 -216
  3. data/ext/gmpf.h +11 -309
  4. data/ext/gmpq.h +8 -482
  5. data/ext/gmpz.h +5 -818
  6. metadata +1 -1
data/ext/gmpf.h CHANGED
@@ -1,314 +1,13 @@
1
- static VALUE r_gmpf_to_d(VALUE self)
2
- {
3
- MP_FLOAT *self_val;
4
- mpf_get_struct (self, self_val);
5
-
6
- return rb_float_new(mpf_get_d(self_val));
7
- }
8
-
9
- static VALUE r_gmpf_to_s(VALUE self)
10
- {
11
- MP_FLOAT *self_val;
12
- char *str, *str2;
13
- VALUE res;
14
- mp_exp_t exponent;
15
-
16
- mpf_get_struct(self, self_val);
17
-
18
- str = mpf_get_str(NULL, &exponent, 10, 0, self_val);
19
- if ((strcmp (str, "NaN") == 0) ||
20
- (strcmp (str, "Inf") == 0) ||
21
- (strcmp (str, "-Inf") == 0))
22
- {
23
- res = rb_str_new2(str);
24
- }
25
- else
26
- {
27
- if (str[0] == '-')
28
- __gmp_asprintf (&str2, "-0.%se%+ld", str+1, exponent);
29
- else
30
- __gmp_asprintf (&str2, "0.%se%+ld", str, exponent);
31
- res = rb_str_new2(str2);
32
- free (str2);
33
- }
34
- free (str);
35
- return res;
36
- }
37
-
38
- static VALUE r_gmpf_add(VALUE self, VALUE arg)
39
- {
40
- MP_FLOAT *self_val, *res_val, *arg_val_f;
41
- MP_RAT *arg_val_q;
42
- MP_INT *arg_val_z;
43
- VALUE res;
44
- unsigned long prec;
45
-
46
- mpf_get_struct_prec (self, self_val, prec);
47
-
48
- if (GMPF_P(arg)) {
49
- mpf_get_struct (arg, arg_val_f);
50
- prec_max(prec, arg_val_f);
51
- mpf_make_struct_init(res, res_val, prec);
52
- mpf_add(res_val, self_val, arg_val_f);
53
- } else if (GMPQ_P(arg)) {
54
- mpq_get_struct (arg, arg_val_q);
55
- mpf_make_struct_init(res, res_val, prec);
56
- mpf_set_q (res_val, arg_val_q);
57
- mpf_add (res_val, res_val, self_val);
58
- } else if (GMPZ_P(arg)) {
59
- mpz_get_struct (arg, arg_val_z);
60
- mpf_make_struct_init(res, res_val, prec);
61
- mpf_set_z (res_val, arg_val_z);
62
- mpf_add (res_val, res_val, self_val);
63
- } else if (FLOAT_P(arg)) {
64
- mpf_make_struct_init(res, res_val, prec);
65
- mpf_set_d (res_val, FLT2DBL(arg));
66
- mpf_add (res_val, res_val, self_val);
67
- } else if (FIXNUM_P(arg)) { // _ui with sign control instead ?
68
- mpf_make_struct_init(res, res_val, prec);
69
- mpf_set_si (res_val, FIX2INT(arg));
70
- mpf_add (res_val, res_val, self_val);
71
- } else if (BIGNUM_P(arg)) {
72
- mpz_temp_from_bignum(arg_val_z, arg);
73
- mpf_make_struct_init(res, res_val, prec);
74
- mpf_set_z (res_val, arg_val_z);
75
- mpf_add (res_val, res_val, self_val);
76
- mpz_temp_free(arg_val_z);
77
- } else {
78
- typeerror(ZQFXBD);
79
- }
1
+ #ifndef _GMPF_H_
2
+ #define _GMPF_H_
80
3
 
81
- return res;
82
- }
83
-
84
- static VALUE r_gmpf_sub(VALUE self, VALUE arg)
85
- {
86
- MP_FLOAT *self_val, *res_val, *arg_val_f;
87
- MP_RAT *arg_val_q;
88
- MP_INT *arg_val_z;
89
- VALUE res;
90
- unsigned long prec;
91
-
92
- mpf_get_struct_prec (self, self_val, prec);
93
-
94
- if (GMPF_P(arg)) {
95
- mpf_get_struct (arg, arg_val_f);
96
- prec_max(prec, arg_val_f);
97
- mpf_make_struct_init(res, res_val, prec);
98
- mpf_sub(res_val, self_val, arg_val_f);
99
- } else if (GMPQ_P(arg)) {
100
- mpq_get_struct (arg, arg_val_q);
101
- mpf_make_struct_init(res, res_val, prec);
102
- mpf_set_q (res_val, arg_val_q);
103
- mpf_sub (res_val, self_val, res_val);
104
- } else if (GMPZ_P(arg)) {
105
- mpz_get_struct (arg, arg_val_z);
106
- mpf_make_struct_init(res, res_val, prec);
107
- mpf_set_z (res_val, arg_val_z);
108
- mpf_sub (res_val, self_val, res_val);
109
- } else if (FLOAT_P(arg)) {
110
- mpf_make_struct_init(res, res_val, prec);
111
- mpf_set_d (res_val, FLT2DBL(arg));
112
- mpf_sub (res_val, self_val, res_val);
113
- } else if (FIXNUM_P(arg)) { // _ui with sign control instead ?
114
- mpf_make_struct_init(res, res_val, prec);
115
- mpf_set_si (res_val, FIX2INT(arg));
116
- mpf_sub (res_val, self_val, res_val);
117
- } else if (BIGNUM_P(arg)) {
118
- mpz_temp_from_bignum(arg_val_z, arg);
119
- mpf_make_struct_init(res, res_val, prec);
120
- mpf_set_z (res_val, arg_val_z);
121
- mpf_sub (res_val, res_val, self_val);
122
- mpz_temp_free(arg_val_z);
123
- } else {
124
- typeerror(ZQFXBD);
125
- }
4
+ /*
5
+ * gmpf.h
6
+ *
7
+ * This file contains GMP::F stuff.
8
+ */
126
9
 
127
- return res;
128
- }
129
-
130
- static VALUE r_gmpf_mul(VALUE self, VALUE arg)
131
- {
132
- MP_FLOAT *self_val, *res_val, *arg_val_f;
133
- MP_RAT *arg_val_q;
134
- MP_INT *arg_val_z;
135
- VALUE res;
136
- unsigned long prec;
137
-
138
- mpf_get_struct_prec (self, self_val, prec);
139
-
140
- if (GMPF_P(arg)) {
141
- mpf_get_struct (arg, arg_val_f);
142
- prec_max(prec, arg_val_f);
143
- mpf_make_struct_init(res, res_val, prec);
144
- mpf_mul(res_val, self_val, arg_val_f);
145
- } else if (GMPQ_P(arg)) {
146
- mpq_get_struct (arg, arg_val_q);
147
- mpf_make_struct_init(res, res_val, prec);
148
- mpf_set_q (res_val, arg_val_q);
149
- mpf_mul (res_val, self_val, res_val);
150
- } else if (GMPZ_P(arg)) {
151
- mpz_get_struct (arg, arg_val_z);
152
- mpf_make_struct_init(res, res_val, prec);
153
- mpf_set_z (res_val, arg_val_z);
154
- mpf_mul (res_val, self_val, res_val);
155
- } else if (FLOAT_P(arg)) {
156
- mpf_make_struct_init(res, res_val, prec);
157
- mpf_set_d (res_val, FLT2DBL(arg));
158
- mpf_mul (res_val, self_val, res_val);
159
- } else if (FIXNUM_P(arg)) { // _ui with sign control instead ?
160
- mpf_make_struct_init(res, res_val, prec);
161
- mpf_set_si (res_val, FIX2INT(arg));
162
- mpf_mul (res_val, self_val, res_val);
163
- } else if (BIGNUM_P(arg)) {
164
- mpz_temp_from_bignum(arg_val_z, arg);
165
- mpf_make_struct_init(res, res_val, prec);
166
- mpf_set_z (res_val, arg_val_z);
167
- mpf_mul (res_val, res_val, self_val);
168
- mpz_temp_free(arg_val_z);
169
- } else {
170
- typeerror(ZQFXBD);
171
- }
172
-
173
- return res;
174
- }
175
-
176
- static VALUE r_gmpf_div(VALUE self, VALUE arg)
177
- {
178
- MP_FLOAT *self_val, *res_val, *arg_val_f;
179
- MP_RAT *arg_val_q;
180
- MP_INT *arg_val_z;
181
- VALUE res;
182
- unsigned long prec;
183
-
184
- mpf_get_struct_prec (self, self_val, prec);
185
-
186
- if (GMPF_P(arg)) {
187
- mpf_get_struct (arg, arg_val_f);
188
- prec_max(prec, arg_val_f);
189
- mpf_make_struct_init(res, res_val, prec);
190
- mpf_div(res_val, self_val, arg_val_f);
191
- } else if (GMPQ_P(arg)) {
192
- mpq_get_struct (arg, arg_val_q);
193
- mpf_make_struct_init(res, res_val, prec);
194
- mpf_set_q (res_val, arg_val_q);
195
- mpf_div (res_val, self_val, res_val);
196
- } else if (GMPZ_P(arg)) {
197
- mpz_get_struct (arg, arg_val_z);
198
- mpf_make_struct_init(res, res_val, prec);
199
- mpf_set_z (res_val, arg_val_z);
200
- mpf_div (res_val, self_val, res_val);
201
- } else if (FLOAT_P(arg)) {
202
- mpf_make_struct_init(res, res_val, prec);
203
- mpf_set_d (res_val, FLT2DBL(arg));
204
- mpf_div (res_val, self_val, res_val);
205
- } else if (FIXNUM_P(arg)) { // _ui with sign control instead ?
206
- mpf_make_struct_init(res, res_val, prec);
207
- mpf_set_si (res_val, FIX2INT(arg));
208
- mpf_div (res_val, self_val, res_val);
209
- } else if (BIGNUM_P(arg)) {
210
- mpz_temp_from_bignum(arg_val_z, arg);
211
- mpf_make_struct_init(res, res_val, prec);
212
- mpf_set_z (res_val, arg_val_z);
213
- mpf_div (res_val, res_val, self_val);
214
- mpz_temp_free(arg_val_z);
215
- } else {
216
- typeerror(ZQFXBD);
217
- }
218
-
219
- return res;
220
- }
221
-
222
- #define DEFUN_FLOAT2FLOAT(fname,mpf_fname) \
223
- static VALUE r_gmpf_##fname(VALUE self) \
224
- {\
225
- MP_FLOAT *self_val, *res_val; \
226
- VALUE res; \
227
- mpf_get_struct(self, self_val); \
228
- mpf_make_struct_init(res, res_val, mpf_get_prec(self_val)); \
229
- mpf_fname(res_val, self_val); \
230
- return res; \
231
- }\
232
- \
233
- static VALUE r_gmpf_##fname##_self(VALUE self) \
234
- {\
235
- MP_FLOAT *self_val; \
236
- mpf_get_struct(self, self_val); \
237
- mpf_fname(self_val, self_val); \
238
- return Qnil; \
239
- }
240
-
241
- DEFUN_FLOAT2FLOAT(abs,mpf_abs)
242
- DEFUN_FLOAT2FLOAT(neg,mpf_neg)
243
- DEFUN_FLOAT2FLOAT(floor,mpf_floor)
244
- DEFUN_FLOAT2FLOAT(trunc,mpf_trunc)
245
- DEFUN_FLOAT2FLOAT(ceil,mpf_ceil)
246
-
247
- int mpf_cmp_value(MP_FLOAT *self_val, VALUE arg)
248
- {
249
- MP_FLOAT *arg_val;
250
- int result;
251
-
252
- if (GMPF_P(arg)) {
253
- mpf_get_struct(arg,arg_val);
254
- return mpf_cmp (self_val, arg_val);
255
- } else {
256
- mpf_temp_init(arg_val, mpf_get_prec (self_val));
257
- mpf_set_value (arg_val, arg);
258
- result = mpf_cmp (self_val, arg_val);
259
- mpf_temp_free(arg_val);
260
- return result;
261
- }
262
- }
263
-
264
- /* what does really "equal" mean ? it's not obvious */
265
- VALUE r_gmpf_eq(VALUE self, VALUE arg)
266
- {
267
- MP_FLOAT *self_val;
268
- mpf_get_struct (self,self_val);
269
- return (mpf_cmp_value(self_val, arg) == 0) ? Qtrue : Qfalse;
270
- }
271
-
272
- VALUE r_gmpf_cmp (VALUE self, VALUE arg)
273
- {
274
- MP_FLOAT *self_val;
275
- int res;
276
- mpf_get_struct (self,self_val);
277
- res = mpf_cmp_value(self_val, arg);
278
- if (res > 0)
279
- return INT2FIX(1);
280
- else if (res == 0)
281
- return INT2FIX(0);
282
- else
283
- return INT2FIX(-1);
284
- }
285
-
286
- #define DEFUN_FLOAT_CMP(name,CMP_OP) \
287
- static VALUE r_gmpf_cmp_##name(VALUE self, VALUE arg) \
288
- { \
289
- MP_FLOAT *self_val; \
290
- mpf_get_struct (self,self_val); \
291
- return (mpf_cmp_value(self_val, arg) CMP_OP 0)?Qtrue:Qfalse; \
292
- }
293
-
294
- DEFUN_FLOAT_CMP(lt,<)
295
- DEFUN_FLOAT_CMP(le,<=)
296
- DEFUN_FLOAT_CMP(gt,>)
297
- DEFUN_FLOAT_CMP(ge,>=)
298
-
299
- static VALUE r_gmpf_sgn(VALUE self)
300
- {
301
- MP_FLOAT *self_val;
302
- mpf_get_struct(self, self_val);
303
- return INT2FIX(mpf_sgn(self_val));
304
- }
305
-
306
- static VALUE r_gmpf_get_prec(VALUE self)
307
- {
308
- MP_FLOAT *self_val;
309
- mpf_get_struct(self, self_val);
310
- return INT2NUM(mpf_get_prec(self_val));
311
- }
10
+ #include <ruby_gmp.h>
312
11
 
313
12
  #ifdef MPFR
314
13
  #define MPFR_SINGLE_FUNCTION(name) \
@@ -440,3 +139,6 @@ static VALUE r_gmpfr_pow(VALUE self, VALUE arg)
440
139
  }
441
140
 
442
141
  #endif
142
+
143
+
144
+ #endif