srawlins-gmp 0.1.4.2 → 0.1.5

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.
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