number 0.9.6 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/ext/interval.c +0 -4
  2. data/ext/number.c +51 -12
  3. data/ext/real.c +1 -1
  4. metadata +2 -2
@@ -319,10 +319,6 @@ Interval* interval_divide (Interval* a, Interval* b)
319
319
  Interval* interval;
320
320
 
321
321
  bounds = (RealBounds*)real_bounds_new();
322
- real_bounds_update(bounds, (Real*)real_divide(a->l, b->l, ROUND_NEAREST), a->L && b->L);
323
- real_bounds_update(bounds, (Real*)real_divide(a->l, b->u, ROUND_NEAREST), a->L && b->R);
324
- real_bounds_update(bounds, (Real*)real_divide(a->u, b->l, ROUND_NEAREST), a->R && b->L);
325
- real_bounds_update(bounds, (Real*)real_divide(a->u, b->u, ROUND_NEAREST), a->R && b->R);
326
322
  real_bounds_update(bounds, (Real*)real_divide(a->l, b->l, ROUND_DOWN), a->L && b->L);
327
323
  real_bounds_update(bounds, (Real*)real_divide(a->l, b->u, ROUND_DOWN), a->L && b->R);
328
324
  real_bounds_update(bounds, (Real*)real_divide(a->u, b->l, ROUND_DOWN), a->R && b->L);
@@ -3,6 +3,14 @@
3
3
  long digs;
4
4
  VALUE rb_cNumber;
5
5
 
6
+ VALUE rb_NilClass_to_number (VALUE nil)
7
+ {
8
+ VALUE result = rb_obj_alloc(rb_cNumber);
9
+ DATA_PTR(result) = (Complex*)complex_nan();
10
+
11
+ return result;
12
+ }
13
+
6
14
  VALUE rb_String_to_number (VALUE str)
7
15
  {
8
16
  VALUE complex_regex = rb_enc_reg_new("^(.*[^\\s]+)\\s*\\+\\s*(.*)i$", strlen("^(.*[^\\s]+)\\s*\\+\\s*(.*)i$"), rb_utf8_encoding(), 0);
@@ -113,11 +121,14 @@ VALUE rb_Complex_to_number (VALUE complex)
113
121
 
114
122
  VALUE rb_f_Number (int argc, VALUE* argv, VALUE obj)
115
123
  {
116
- int L;
117
- int R;
118
124
  Complex* tmp1;
119
125
  Complex* tmp2;
120
126
  Complex* tmp3;
127
+ Interval* i1;
128
+ Interval* i2;
129
+ VALUE tmp_A;
130
+ VALUE tmp_B;
131
+ VALUE tmp_C;
121
132
  VALUE arg1;
122
133
  VALUE arg2;
123
134
  VALUE arg3;
@@ -128,25 +139,52 @@ VALUE rb_f_Number (int argc, VALUE* argv, VALUE obj)
128
139
  switch (rb_scan_args(argc, argv, "14", &arg1, &arg2, &arg3, &arg4, &arg5))
129
140
  {
130
141
  case 1:
131
- DATA_PTR(result) = (Complex*)complex_dup(DATA_PTR(rb_convert_type(arg1, T_DATA, "Number", "to_number")));
142
+ tmp_A = rb_convert_type(arg1, T_DATA, "Number", "to_number");
143
+ tmp1 = (Complex*)DATA_PTR(tmp_A);
144
+
145
+ DATA_PTR(result) = (Complex*)complex_dup(tmp1);
132
146
  break;
133
147
 
134
148
  case 2:
135
- tmp1 = (Complex*)DATA_PTR(rb_convert_type(arg1, T_DATA, "Number", "to_number"));
136
- tmp2 = (Complex*)DATA_PTR(rb_convert_type(arg2, T_DATA, "Number", "to_number"));
149
+ tmp_A = rb_convert_type(arg1, T_DATA, "Number", "to_number");
150
+ tmp_B = rb_convert_type(arg2, T_DATA, "Number", "to_number");
137
151
 
138
- DATA_PTR(result) = (Complex*)complex_new((Interval*)interval_dup(tmp1->re), (Interval*)interval_dup(tmp2->re));
152
+ tmp1 = (Complex*)DATA_PTR(tmp_A);
153
+ tmp2 = (Complex*)DATA_PTR(tmp_B);
154
+
155
+ Interval* re1 = (Interval*)tmp1->re;
156
+ Interval* re2 = (Interval*)tmp2->re;
157
+
158
+ i1 = (Interval*)interval_dup(re1);
159
+ i2 = (Interval*)interval_dup(re2);
160
+
161
+ DATA_PTR(result) = (Complex*)complex_new(i1, i2);
139
162
  break;
140
163
 
141
164
  default:
142
- L = (argc == 3) ? true : RTEST(arg4);
143
- R = (argc == 5) ? RTEST(arg5) : L;
165
+ tmp_A = rb_convert_type(arg1, T_DATA, "Number", "to_number");
166
+ tmp_B = rb_convert_type(arg2, T_DATA, "Number", "to_number");
167
+ tmp_C = rb_convert_type(arg3, T_DATA, "Number", "to_number");
168
+
169
+ tmp1 = (Complex*)DATA_PTR(tmp_A);
170
+ tmp2 = (Complex*)DATA_PTR(tmp_B);
171
+ tmp3 = (Complex*)DATA_PTR(tmp_C);
172
+
173
+ Real* n1 = (Real*)tmp1->re->n;
174
+ Real* n2 = (Real*)tmp2->re->n;
175
+ Real* n3 = (Real*)tmp3->re->n;
176
+
177
+ Real* r1 = (Real*)real_dup(n1);
178
+ Real* r2 = (Real*)real_dup(n2);
179
+ Real* r3 = (Real*)real_dup(n3);
180
+
181
+ int L = (argc == 3) ? true : RTEST(arg4);
182
+ int R = (argc == 5) ? RTEST(arg5) : L;
144
183
 
145
- tmp1 = (Complex*)DATA_PTR(rb_convert_type(arg1, T_DATA, "Number", "to_number"));
146
- tmp2 = (Complex*)DATA_PTR(rb_convert_type(arg2, T_DATA, "Number", "to_number"));
147
- tmp3 = (Complex*)DATA_PTR(rb_convert_type(arg3, T_DATA, "Number", "to_number"));
184
+ i1 = (Interval*)interval_new(r1, L, r2, R, r3);
185
+ i2 = (Interval*)interval_zero();
148
186
 
149
- DATA_PTR(result) = (Complex*)complex_new((Interval*)interval_new((Real*)real_dup(tmp1->re->n), L, (Real*)real_dup(tmp2->re->n), R, (Real*)real_dup(tmp3->re->n)), (Interval*)interval_zero());
187
+ DATA_PTR(result) = (Complex*)complex_new(i1, i2);
150
188
  break;
151
189
  }
152
190
 
@@ -1387,6 +1425,7 @@ void Init_number ()
1387
1425
  init_real_tmp_nums();
1388
1426
  init_complex_tmp_nums();
1389
1427
 
1428
+ rb_define_method(rb_cNilClass, "to_number", rb_NilClass_to_number, 0);
1390
1429
  rb_define_method(rb_cString, "to_number", rb_String_to_number, 0);
1391
1430
  rb_define_method(rb_cInteger, "to_number", rb_Integer_to_number, 0);
1392
1431
  rb_define_method(rb_cFloat, "to_number", rb_Float_to_number, 0);
data/ext/real.c CHANGED
@@ -530,7 +530,7 @@ Real* real_e (int round_mode)
530
530
  */
531
531
  Real* real_dup (Real* real)
532
532
  {
533
- return REAL(real) ? real_new_exact(real->num, real->exp) : real_new_flagged(real->flag);
533
+ return REAL(real) ? (Real*)real_new_exact(real->num, real->exp) : (Real*)real_new_flagged(real->flag);
534
534
  }
535
535
 
536
536
  /*
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: number
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.6
5
+ version: 0.9.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jesse Sielaff
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2011-07-18 00:00:00 Z
15
+ date: 2011-07-27 00:00:00 Z
16
16
  dependencies: []
17
17
 
18
18
  description: The Number gem is intended to be a drop-in replacement for Ruby's Numeric classes when arbitrary-precision complex interval calculations are warranted. The basis of the arbitrary-precision calculations is the GNU MP, MPFR, and MPC libraries.