bigdecimal 1.2.2 → 1.2.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c97cb6ce62111804b296b14c294e00833500b5d9
4
- data.tar.gz: d6c8d262b5acb0d1e5ff652ffc2b63a5acad8c21
3
+ metadata.gz: 60d3dce1a57a777beadceb1451b2e0972b60181a
4
+ data.tar.gz: 65e7f3cab117bbbdc380fa3680187fa666b2ce9e
5
5
  SHA512:
6
- metadata.gz: d69e3aa32a795c3ff76b080198867a7cff700a87ad373be151ead80f9035168216139c0db73d5c1bce8fd044cd863ef21cac7351b0d49b30fe35829b7696404a
7
- data.tar.gz: ca5224f1997fb8c31decf7b41a26a05134efd6b6f5284dc576c89c6d51061eb58d51d72b5f05c008e063c5c73646aab167c4ef4fc226981b99ebf4ba0ac84070
6
+ metadata.gz: 7c9dbd7e5132491e100390193c623310c24f24b65dfd5dbb351dd8254e353d0748f5c5fffb3c868fb0f889095d60080d5e2b026f74caf30eae8925a23c912c0a
7
+ data.tar.gz: 827e65f0a6ad81a6a2d499aa4d53fd566f3d67338b9294d1bf17642e24dedcd3e9c5ad562064f32ab9b5ee256d6d5f24b355bd3f094cef6ecf6d668aa21ca532
@@ -190,13 +190,13 @@ cannot_be_coerced_into_BigDecimal(VALUE exc_class, VALUE v)
190
190
  rb_exc_raise(rb_exc_new3(exc_class, str));
191
191
  }
192
192
 
193
- static VALUE BigDecimal_div2(int, VALUE*, VALUE);
193
+ static inline VALUE BigDecimal_div2(VALUE, VALUE, VALUE);
194
194
 
195
195
  static Real*
196
196
  GetVpValueWithPrec(VALUE v, long prec, int must)
197
197
  {
198
198
  Real *pv;
199
- VALUE num, bg, args[2];
199
+ VALUE num, bg;
200
200
  char szD[128];
201
201
  VALUE orig = Qundef;
202
202
 
@@ -215,9 +215,7 @@ again:
215
215
  pv = GetVpValueWithPrec(num, -1, must);
216
216
  if (pv == NULL) goto SomeOneMayDoIt;
217
217
 
218
- args[0] = RRATIONAL(v)->den;
219
- args[1] = LONG2NUM(prec);
220
- v = BigDecimal_div2(2, args, ToValue(pv));
218
+ v = BigDecimal_div2(ToValue(pv), RRATIONAL(v)->den, LONG2NUM(prec));
221
219
  goto again;
222
220
  }
223
221
 
@@ -1456,42 +1454,55 @@ BigDecimal_divmod(VALUE self, VALUE r)
1456
1454
  /*
1457
1455
  * See BigDecimal#quo
1458
1456
  */
1459
- static VALUE
1460
- BigDecimal_div2(int argc, VALUE *argv, VALUE self)
1457
+ static inline VALUE
1458
+ BigDecimal_div2(VALUE self, VALUE b, VALUE n)
1461
1459
  {
1462
1460
  ENTER(5);
1463
- VALUE b,n;
1464
- int na = rb_scan_args(argc, argv, "11", &b, &n);
1465
- if (na == 1) { /* div in Float sense */
1466
- Real *div = NULL;
1467
- Real *mod;
1468
- if (BigDecimal_DoDivmod(self, b, &div, &mod)) {
1469
- return BigDecimal_to_i(ToValue(div));
1470
- }
1471
- return DoSomeOne(self, b, rb_intern("div"));
1472
- } else { /* div in BigDecimal sense */
1473
- SIGNED_VALUE ix = GetPositiveInt(n);
1474
- if (ix == 0) return BigDecimal_div(self, b);
1475
- else {
1476
- Real *res = NULL;
1477
- Real *av = NULL, *bv = NULL, *cv = NULL;
1478
- size_t mx = ix + VpBaseFig()*2;
1479
- size_t pl = VpSetPrecLimit(0);
1461
+ SIGNED_VALUE ix;
1480
1462
 
1481
- GUARD_OBJ(cv, VpCreateRbObject(mx, "0"));
1482
- GUARD_OBJ(av, GetVpValue(self, 1));
1483
- GUARD_OBJ(bv, GetVpValue(b, 1));
1484
- mx = av->Prec + bv->Prec + 2;
1485
- if (mx <= cv->MaxPrec) mx = cv->MaxPrec + 1;
1486
- GUARD_OBJ(res, VpCreateRbObject((mx * 2 + 2)*VpBaseFig(), "#0"));
1487
- VpDivd(cv, res, av, bv);
1488
- VpSetPrecLimit(pl);
1489
- VpLeftRound(cv, VpGetRoundMode(), ix);
1490
- return ToValue(cv);
1491
- }
1463
+ if (NIL_P(n)) { /* div in Float sense */
1464
+ Real *div = NULL;
1465
+ Real *mod;
1466
+ if (BigDecimal_DoDivmod(self, b, &div, &mod)) {
1467
+ return BigDecimal_to_i(ToValue(div));
1468
+ }
1469
+ return DoSomeOne(self, b, rb_intern("div"));
1470
+ }
1471
+
1472
+ /* div in BigDecimal sense */
1473
+ ix = GetPositiveInt(n);
1474
+ if (ix == 0) {
1475
+ return BigDecimal_div(self, b);
1476
+ }
1477
+ else {
1478
+ Real *res = NULL;
1479
+ Real *av = NULL, *bv = NULL, *cv = NULL;
1480
+ size_t mx = ix + VpBaseFig()*2;
1481
+ size_t pl = VpSetPrecLimit(0);
1482
+
1483
+ GUARD_OBJ(cv, VpCreateRbObject(mx, "0"));
1484
+ GUARD_OBJ(av, GetVpValue(self, 1));
1485
+ GUARD_OBJ(bv, GetVpValue(b, 1));
1486
+ mx = av->Prec + bv->Prec + 2;
1487
+ if (mx <= cv->MaxPrec) mx = cv->MaxPrec + 1;
1488
+ GUARD_OBJ(res, VpCreateRbObject((mx * 2 + 2)*VpBaseFig(), "#0"));
1489
+ VpDivd(cv, res, av, bv);
1490
+ VpSetPrecLimit(pl);
1491
+ VpLeftRound(cv, VpGetRoundMode(), ix);
1492
+ return ToValue(cv);
1492
1493
  }
1493
1494
  }
1494
1495
 
1496
+ static VALUE
1497
+ BigDecimal_div3(int argc, VALUE *argv, VALUE self)
1498
+ {
1499
+ VALUE b,n;
1500
+
1501
+ rb_scan_args(argc, argv, "11", &b, &n);
1502
+
1503
+ return BigDecimal_div2(self, b, n);
1504
+ }
1505
+
1495
1506
  static VALUE
1496
1507
  BigDecimal_add2(VALUE self, VALUE b, VALUE n)
1497
1508
  {
@@ -2183,7 +2194,7 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
2183
2194
  return ToValue(y);
2184
2195
  }
2185
2196
 
2186
- retry:
2197
+ retry:
2187
2198
  switch (TYPE(vexp)) {
2188
2199
  case T_FIXNUM:
2189
2200
  break;
@@ -2370,7 +2381,7 @@ retry:
2370
2381
  }
2371
2382
  }
2372
2383
 
2373
- int_exp = FIX2INT(vexp);
2384
+ int_exp = FIX2LONG(vexp);
2374
2385
  ma = int_exp;
2375
2386
  if (ma < 0) ma = -ma;
2376
2387
  if (ma == 0) ma = 1;
@@ -2383,7 +2394,7 @@ retry:
2383
2394
  GUARD_OBJ(y, VpCreateRbObject(1, "0"));
2384
2395
  }
2385
2396
  VpPower(y, x, int_exp);
2386
- if (VpIsDef(y)) {
2397
+ if (!NIL_P(prec) && VpIsDef(y)) {
2387
2398
  VpMidRound(y, VpGetRoundMode(), n);
2388
2399
  }
2389
2400
  return ToValue(y);
@@ -2664,7 +2675,7 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
2664
2675
  {
2665
2676
  ssize_t prec, n, i;
2666
2677
  Real* vx = NULL;
2667
- VALUE one, d, x1, y, z;
2678
+ VALUE one, d, y;
2668
2679
  int negative = 0;
2669
2680
  int infinite = 0;
2670
2681
  int nan = 0;
@@ -2740,14 +2751,11 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
2740
2751
  }
2741
2752
 
2742
2753
  one = ToValue(VpCreateRbObject(1, "1"));
2743
- x1 = one;
2744
2754
  y = one;
2745
2755
  d = y;
2746
- z = one;
2747
- i = 0;
2756
+ i = 1;
2748
2757
 
2749
2758
  while (!VpIsZero((Real*)DATA_PTR(d))) {
2750
- VALUE argv[2];
2751
2759
  SIGNED_VALUE const ey = VpExponent10(DATA_PTR(y));
2752
2760
  SIGNED_VALUE const ed = VpExponent10(DATA_PTR(d));
2753
2761
  ssize_t m = n - vabs(ey - ed);
@@ -2761,20 +2769,14 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
2761
2769
  m = rmpd_double_figures();
2762
2770
  }
2763
2771
 
2764
- x1 = BigDecimal_mult2(x1, x, SSIZET2NUM(n));
2765
- ++i;
2766
- z = BigDecimal_mult(z, SSIZET2NUM(i));
2767
- argv[0] = z;
2768
- argv[1] = SSIZET2NUM(m);
2769
- d = BigDecimal_div2(2, argv, x1);
2770
- y = BigDecimal_add(y, d);
2772
+ d = BigDecimal_mult(d, x); /* d <- d * x */
2773
+ d = BigDecimal_div2(d, SSIZET2NUM(i), SSIZET2NUM(m)); /* d <- d / i */
2774
+ y = BigDecimal_add(y, d); /* y <- y + d */
2775
+ ++i; /* i <- i + 1 */
2771
2776
  }
2772
2777
 
2773
2778
  if (negative) {
2774
- VALUE argv[2];
2775
- argv[0] = y;
2776
- argv[1] = vprec;
2777
- return BigDecimal_div2(2, argv, one);
2779
+ return BigDecimal_div2(one, y, vprec);
2778
2780
  }
2779
2781
  else {
2780
2782
  vprec = SSIZET2NUM(prec - VpExponent10(DATA_PTR(y)));
@@ -2783,10 +2785,8 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
2783
2785
 
2784
2786
  RB_GC_GUARD(one);
2785
2787
  RB_GC_GUARD(x);
2786
- RB_GC_GUARD(x1);
2787
2788
  RB_GC_GUARD(y);
2788
2789
  RB_GC_GUARD(d);
2789
- RB_GC_GUARD(z);
2790
2790
  }
2791
2791
 
2792
2792
  /* call-seq:
@@ -2807,7 +2807,7 @@ BigMath_s_log(VALUE klass, VALUE x, VALUE vprec)
2807
2807
  ssize_t prec, n, i;
2808
2808
  SIGNED_VALUE expo;
2809
2809
  Real* vx = NULL;
2810
- VALUE argv[2], vn, one, two, w, x2, y, d;
2810
+ VALUE vn, one, two, w, x2, y, d;
2811
2811
  int zero = 0;
2812
2812
  int negative = 0;
2813
2813
  int infinite = 0;
@@ -2913,9 +2913,7 @@ get_vp_value:
2913
2913
  expo = 0;
2914
2914
  }
2915
2915
  w = BigDecimal_sub(x, one);
2916
- argv[0] = BigDecimal_add(x, one);
2917
- argv[1] = vn;
2918
- x = BigDecimal_div2(2, argv, w);
2916
+ x = BigDecimal_div2(w, BigDecimal_add(x, one), vn);
2919
2917
  RB_GC_GUARD(x2) = BigDecimal_mult2(x, x, vn);
2920
2918
  RB_GC_GUARD(y) = x;
2921
2919
  RB_GC_GUARD(d) = y;
@@ -2933,9 +2931,7 @@ get_vp_value:
2933
2931
 
2934
2932
  x = BigDecimal_mult2(x2, x, vn);
2935
2933
  i += 2;
2936
- argv[0] = SSIZET2NUM(i);
2937
- argv[1] = SSIZET2NUM(m);
2938
- d = BigDecimal_div2(2, argv, x);
2934
+ d = BigDecimal_div2(x, SSIZET2NUM(i), SSIZET2NUM(m));
2939
2935
  y = BigDecimal_add(y, d);
2940
2936
  }
2941
2937
 
@@ -3214,7 +3210,7 @@ Init_bigdecimal(void)
3214
3210
  rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
3215
3211
  rb_define_method(rb_cBigDecimal, "sub", BigDecimal_sub2, 2);
3216
3212
  rb_define_method(rb_cBigDecimal, "mult", BigDecimal_mult2, 2);
3217
- rb_define_method(rb_cBigDecimal, "div", BigDecimal_div2, -1);
3213
+ rb_define_method(rb_cBigDecimal, "div", BigDecimal_div3, -1);
3218
3214
  rb_define_method(rb_cBigDecimal, "hash", BigDecimal_hash, 0);
3219
3215
  rb_define_method(rb_cBigDecimal, "to_s", BigDecimal_to_s, -1);
3220
3216
  rb_define_method(rb_cBigDecimal, "to_i", BigDecimal_to_i, 0);
@@ -1,10 +1,9 @@
1
1
  # -*- ruby -*-
2
- _VERSION = "1.2.2"
2
+ _VERSION = "1.2.3"
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "bigdecimal"
6
6
  s.version = _VERSION
7
- s.date = "2012-02-19"
8
7
  s.summary = "Arbitrary-precision decimal floating-point number library."
9
8
  s.homepage = "http://www.ruby-lang.org"
10
9
  s.email = "mrkn@mrkn.jp"
@@ -226,19 +226,6 @@ module BigMath
226
226
  #
227
227
  def E(prec)
228
228
  raise ArgumentError, "Zero or negative precision for E" if prec <= 0
229
- n = prec + BigDecimal.double_fig
230
- one = BigDecimal("1")
231
- y = one
232
- d = y
233
- z = one
234
- i = 0
235
- while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
236
- m = BigDecimal.double_fig if m < BigDecimal.double_fig
237
- i += 1
238
- z *= i
239
- d = one.div(z,m)
240
- y += d
241
- end
242
- y
229
+ BigMath.exp(1, prec)
243
230
  end
244
231
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bigdecimal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenta Murata
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-02-19 00:00:00.000000000 Z
13
+ date: 2013-11-25 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: This library provides arbitrary-precision decimal floating-point number
16
16
  class.
@@ -20,10 +20,10 @@ extensions:
20
20
  - extconf.rb
21
21
  extra_rdoc_files: []
22
22
  files:
23
- - bigdecimal.gemspec
23
+ - README
24
24
  - bigdecimal.c
25
+ - bigdecimal.gemspec
25
26
  - bigdecimal.h
26
- - README
27
27
  - depend
28
28
  - extconf.rb
29
29
  - lib/bigdecimal/jacobian.rb
@@ -40,22 +40,21 @@ metadata: {}
40
40
  post_install_message:
41
41
  rdoc_options: []
42
42
  require_paths:
43
- - .
43
+ - "."
44
44
  required_ruby_version: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  required_rubygems_version: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - '>='
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  requirements: []
55
55
  rubyforge_project:
56
- rubygems_version: 2.0.3
56
+ rubygems_version: 2.2.0.preview.2
57
57
  signing_key:
58
58
  specification_version: 4
59
59
  summary: Arbitrary-precision decimal floating-point number library.
60
60
  test_files: []
61
- has_rdoc: