number 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -170,22 +170,16 @@ void real_print (char* buf, Real* real)
170
170
  */
171
171
  void real_pad_tmps (Real* a, Real* b, long* exp, long* len)
172
172
  {
173
- long a_len;
174
- long b_len;
175
- long a_last_place;
176
- long b_last_place;
177
- long pad;
178
-
179
173
  mpz_set(a_tmp, a->num);
180
174
  mpz_set(b_tmp, b->num);
181
175
 
182
- a_len = num_len(a_tmp);
183
- b_len = num_len(b_tmp);
176
+ long a_len = num_len(a_tmp);
177
+ long b_len = num_len(b_tmp);
184
178
 
185
- a_last_place = 1 + a->exp - a_len;
186
- b_last_place = 1 + b->exp - b_len;
179
+ long a_last_place = 1 + a->exp - a_len;
180
+ long b_last_place = 1 + b->exp - b_len;
187
181
 
188
- pad = a_last_place - b_last_place;
182
+ long pad = a_last_place - b_last_place;
189
183
 
190
184
  if (pad > 0)
191
185
  {
@@ -231,8 +225,6 @@ int real_positive_p (Real* real)
231
225
  */
232
226
  int real_cmp (Real* a, Real* b)
233
227
  {
234
- int a_sign;
235
- int b_sign;
236
228
  long exp;
237
229
  long len;
238
230
 
@@ -241,8 +233,8 @@ int real_cmp (Real* a, Real* b)
241
233
  return (NaN(a) || NaN(b)) ? 0 : POS_INF(a) ? (POS_INF(b) ? 0 : 1) : POS_INF(b) ? -1 : NEG_INF(a) ? (NEG_INF(b) ? 0 : -1) : 1;
242
234
  }
243
235
 
244
- a_sign = mpz_sgn(a->num);
245
- b_sign = mpz_sgn(b->num);
236
+ int a_sign = mpz_sgn(a->num);
237
+ int b_sign = mpz_sgn(b->num);
246
238
 
247
239
  if (a_sign != b_sign)
248
240
  {
@@ -303,8 +295,7 @@ int real_le_p (Real* a, Real* b)
303
295
  */
304
296
  Real* real_alloc ()
305
297
  {
306
- Real* real;
307
- real = malloc(sizeof(Real));
298
+ Real* real = malloc(sizeof(Real));
308
299
 
309
300
  if (real == NULL)
310
301
  {
@@ -325,8 +316,7 @@ Real* real_alloc ()
325
316
  */
326
317
  Real* real_new_flagged (int flag)
327
318
  {
328
- Real* real;
329
- real = real_alloc();
319
+ Real* real = real_alloc();
330
320
 
331
321
  real->exp = 0;
332
322
  real->flag = flag;
@@ -344,8 +334,7 @@ Real* real_new_flagged (int flag)
344
334
  */
345
335
  Real* real_new_exact (mpz_t num, long exp)
346
336
  {
347
- Real* real;
348
- real = real_alloc();
337
+ Real* real = real_alloc();
349
338
 
350
339
  real->exp = exp;
351
340
  real->flag = 0;
@@ -360,22 +349,17 @@ Real* real_new_exact (mpz_t num, long exp)
360
349
 
361
350
  mpz_set(real->num, num);
362
351
 
363
- if (mpz_sgn(real->num))
352
+ if (mpz_sgn(real->num) == 0)
353
+ {
354
+ real->exp = 0;
355
+ }
356
+ else
364
357
  {
365
- while (mpz_divisible_ui_p(real->num, 10000))
366
- {
367
- mpz_divexact_ui(real->num, real->num, 10000);
368
- }
369
-
370
358
  while (mpz_divisible_ui_p(real->num, 10))
371
359
  {
372
360
  mpz_divexact_ui(real->num, real->num, 10);
373
361
  }
374
362
  }
375
- else
376
- {
377
- real->exp = 0;
378
- }
379
363
 
380
364
  return real;
381
365
  }
@@ -392,13 +376,10 @@ Real* real_new_exact (mpz_t num, long exp)
392
376
  */
393
377
  Real* real_new_rounded (mpz_t num, long exp, int round_mode)
394
378
  {
395
- long len;
396
- long overrun;
397
-
398
379
  mpz_set(tmp_real_new_rounded, num);
399
380
 
400
- len = num_len(num);
401
- overrun = len - digs;
381
+ long len = num_len(num);
382
+ long overrun = len - digs;
402
383
 
403
384
  if (overrun > 0)
404
385
  {
@@ -578,15 +559,12 @@ Real* real_negate (Real* real)
578
559
  */
579
560
  Real* real_ceil (Real* real)
580
561
  {
581
- long len;
582
- long dec;
583
-
584
562
  REAL_CHECK(real);
585
563
 
586
564
  mpz_set(tmp_real_ceil, real->num);
587
565
 
588
- len = num_len(tmp_real_ceil);
589
- dec = len - real->exp;
566
+ long len = num_len(tmp_real_ceil);
567
+ long dec = len - real->exp;
590
568
 
591
569
  if (dec > 0)
592
570
  {
@@ -606,15 +584,12 @@ Real* real_ceil (Real* real)
606
584
  */
607
585
  Real* real_floor (Real* real)
608
586
  {
609
- long len;
610
- long dec;
611
-
612
587
  REAL_CHECK(real);
613
588
 
614
589
  mpz_set(tmp_real_floor, real->num);
615
590
 
616
- len = num_len(tmp_real_floor);
617
- dec = len - real->exp;
591
+ long len = num_len(tmp_real_floor);
592
+ long dec = len - real->exp;
618
593
 
619
594
  if (dec > 0)
620
595
  {
@@ -634,15 +609,12 @@ Real* real_floor (Real* real)
634
609
  */
635
610
  Real* real_round (Real* real)
636
611
  {
637
- long len;
638
- long dec;
639
-
640
612
  REAL_CHECK(real);
641
613
 
642
614
  mpz_set(tmp_real_round, real->num);
643
615
 
644
- len = num_len(tmp_real_round);
645
- dec = len - real->exp;
616
+ long len = num_len(tmp_real_round);
617
+ long dec = len - real->exp;
646
618
 
647
619
  if (dec > 0)
648
620
  {
@@ -662,15 +634,12 @@ Real* real_round (Real* real)
662
634
  */
663
635
  Real* real_round_infinity (Real* real)
664
636
  {
665
- long len;
666
- long dec;
667
-
668
637
  REAL_CHECK(real);
669
638
 
670
639
  mpz_set(tmp_real_round_infinity, real->num);
671
640
 
672
- len = num_len(tmp_real_round_infinity);
673
- dec = len - real->exp;
641
+ long len = num_len(tmp_real_round_infinity);
642
+ long dec = len - real->exp;
674
643
 
675
644
  if (dec > 0)
676
645
  {
@@ -690,15 +659,12 @@ Real* real_round_infinity (Real* real)
690
659
  */
691
660
  Real* real_round_origin (Real* real)
692
661
  {
693
- long len;
694
- long dec;
695
-
696
662
  REAL_CHECK(real);
697
663
 
698
664
  mpz_set(tmp_real_round_origin, real->num);
699
665
 
700
- len = num_len(tmp_real_round_origin);
701
- dec = len - real->exp;
666
+ long len = num_len(tmp_real_round_origin);
667
+ long dec = len - real->exp;
702
668
 
703
669
  if (dec > 0)
704
670
  {
@@ -764,21 +730,16 @@ Real* real_subtract (Real* a, Real* b)
764
730
  */
765
731
  Real* real_multiply (Real* a, Real* b)
766
732
  {
767
- long a_len;
768
- long b_len;
769
- long exp;
770
- long dec;
771
-
772
733
  if (!REAL(a) || !REAL(b))
773
734
  {
774
735
  return (NaN(a) || NaN(b) || ZERO(a) || ZERO(b)) ? real_nan() : ((POS(a) && POS(b)) || (NEG(a) && NEG(b))) ? real_pos_inf() : real_neg_inf();
775
736
  }
776
737
 
777
- a_len = num_len(a->num);
778
- b_len = num_len(b->num);
738
+ long a_len = num_len(a->num);
739
+ long b_len = num_len(b->num);
779
740
 
780
741
  mpz_mul(tmp_real_multiply, a->num, b->num);
781
- exp = num_len(tmp_real_multiply) - ((a_len - a->exp) + (b_len - b->exp));
742
+ long exp = num_len(tmp_real_multiply) - ((a_len - a->exp) + (b_len - b->exp));
782
743
 
783
744
  return real_new_exact(tmp_real_multiply, exp);
784
745
  }
@@ -796,7 +757,6 @@ Real* real_divide (Real* a, Real* b, int round_mode)
796
757
  mpfr_t a_num;
797
758
  mpfr_t b_num;
798
759
  mpfr_t num;
799
- Real* result;
800
760
 
801
761
  if (!REAL(a) || !REAL(b))
802
762
  {
@@ -811,7 +771,7 @@ Real* real_divide (Real* a, Real* b, int round_mode)
811
771
  mpfr_init2(num, PREC);
812
772
  mpfr_div(num, a_num, b_num, MPFR_RNDN);
813
773
 
814
- result = real_from_mpfr(num, round_mode);
774
+ Real* result = real_from_mpfr(num, round_mode);
815
775
 
816
776
  mpfr_clear(a_num);
817
777
  mpfr_clear(b_num);
@@ -24,7 +24,7 @@ void real_bounds_update (RealBounds* bounds, Real* real, int closed)
24
24
  int min_cmp;
25
25
  int max_cmp;
26
26
 
27
- if (!bounds->min || (min_cmp = real_cmp(bounds->min, real)) != -1)
27
+ if (min_cmp = real_cmp(bounds->min, real) != -1)
28
28
  {
29
29
  real_free(bounds->min);
30
30
 
@@ -32,7 +32,7 @@ void real_bounds_update (RealBounds* bounds, Real* real, int closed)
32
32
  bounds->min_closed = (min_cmp) ? closed : bounds->min_closed || closed;
33
33
  }
34
34
 
35
- if (!bounds->max || (max_cmp = real_cmp(bounds->max, real)) != 1)
35
+ if (max_cmp = real_cmp(bounds->max, real) != 1)
36
36
  {
37
37
  real_free(bounds->max);
38
38
 
@@ -45,8 +45,7 @@ void real_bounds_update (RealBounds* bounds, Real* real, int closed)
45
45
 
46
46
  RealBounds* real_bounds_new ()
47
47
  {
48
- RealBounds* bounds;
49
- bounds = malloc(sizeof(RealBounds));
48
+ RealBounds* bounds = malloc(sizeof(RealBounds));
50
49
 
51
50
  if (bounds == NULL)
52
51
  {
@@ -54,4 +53,9 @@ RealBounds* real_bounds_new ()
54
53
  }
55
54
 
56
55
  memset(bounds, 0, sizeof(RealBounds));
56
+
57
+ bounds->min = real_pos_inf();
58
+ bounds->max = real_neg_inf();
59
+
60
+ return bounds;
57
61
  }
@@ -2,45 +2,72 @@
2
2
 
3
3
  Complex* complex_round (Complex* complex)
4
4
  {
5
- return complex_new(interval_round(complex->re), interval_round(complex->im));
5
+ Interval* re = interval_round(complex->re);
6
+ Interval* im = interval_round(complex->im);
7
+
8
+ return complex_new(re, im);
6
9
  }
7
10
 
8
11
  Complex* complex_round_c_c (Complex* complex)
9
12
  {
10
- return complex_new(interval_round_ceiling(complex->re), interval_round_ceiling(complex->im));
13
+ Interval* re = interval_round_ceiling(complex->re);
14
+ Interval* im = interval_round_ceiling(complex->im);
15
+
16
+ return complex_new(re, im);
11
17
  }
12
18
 
13
19
  Complex* complex_round_c_f (Complex* complex)
14
20
  {
15
- return complex_new(interval_round_floor(complex->re), interval_round_ceiling(complex->im));
21
+ Interval* re = interval_round_ceiling(complex->re);
22
+ Interval* im = interval_round_floor(complex->im);
23
+
24
+ return complex_new(re, im);
16
25
  }
17
26
 
18
27
  Complex* complex_round_f_c (Complex* complex)
19
28
  {
20
- return complex_new(interval_round_ceiling(complex->re), interval_round_floor(complex->im));
29
+ Interval* re = interval_round_floor(complex->re);
30
+ Interval* im = interval_round_ceiling(complex->im);
31
+
32
+ return complex_new(re, im);
21
33
  }
22
34
 
23
35
  Complex* complex_round_f_f (Complex* complex)
24
36
  {
25
- return complex_new(interval_round_floor(complex->re), interval_round_floor(complex->im));
37
+ Interval* re = interval_round_floor(complex->re);
38
+ Interval* im = interval_round_floor(complex->im);
39
+
40
+ return complex_new(re, im);
26
41
  }
27
42
 
28
43
  Complex* complex_round_i_i (Complex* complex)
29
44
  {
30
- return complex_new(interval_round_infinity(complex->re), interval_round_infinity(complex->im));
45
+ Interval* re = interval_round_infinity(complex->re);
46
+ Interval* im = interval_round_infinity(complex->im);
47
+
48
+ return complex_new(re, im);
31
49
  }
32
50
 
33
51
  Complex* complex_round_i_o (Complex* complex)
34
52
  {
35
- return complex_new(interval_round_infinity(complex->re), interval_round_origin(complex->im));
53
+ Interval* re = interval_round_infinity(complex->re);
54
+ Interval* im = interval_round_origin(complex->im);
55
+
56
+ return complex_new(re, im);
36
57
  }
37
58
 
38
59
  Complex* complex_round_o_i (Complex* complex)
39
60
  {
40
- return complex_new(interval_round_origin(complex->re), interval_round_infinity(complex->im));
61
+ Interval* re = interval_round_origin(complex->re);
62
+ Interval* im = interval_round_infinity(complex->im);
63
+
64
+ return complex_new(re, im);
41
65
  }
42
66
 
43
67
  Complex* complex_round_o_o (Complex* complex)
44
68
  {
45
- return complex_new(interval_round_origin(complex->re), interval_round_origin(complex->im));
69
+ Interval* re = interval_round_origin(complex->re);
70
+ Interval* im = interval_round_origin(complex->im);
71
+
72
+ return complex_new(re, im);
46
73
  }
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: number
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.9
5
+ version: 0.9.10
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-08-10 00:00:00 Z
15
+ date: 2011-09-02 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.
@@ -60,7 +60,7 @@ requirements:
60
60
  - MPFR
61
61
  - MPC
62
62
  rubyforge_project:
63
- rubygems_version: 1.8.7
63
+ rubygems_version: 1.8.8
64
64
  signing_key:
65
65
  specification_version: 3
66
66
  summary: An arbitrary-precision complex interval number library for Ruby.