bigdecimal 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f755d262f35a249de6848a00e3bf3b8d7a4816dc9a61bb81c099a22baa40bf66
4
- data.tar.gz: f3b06716476c5da9c8a8006b6aeca492ac0206bce305c23910280fe0a0b28de1
3
+ metadata.gz: ef063cb7c648ba239e4179669ed4d410d9d160e293377ce4b1bdb73ec68366cb
4
+ data.tar.gz: d0e2d57a69c624ba2ef446c52fc19f889721809e7f6933ed8f0db684e3f9c1a2
5
5
  SHA512:
6
- metadata.gz: 35be1b5d13ee12b4b40ab3cf7277fb235fffcaf554f71107fe3b0727bcef9edb6b03c02bd7db0039505a575752a8014f41402775e8080ec9da2dcda184787df5
7
- data.tar.gz: f4f063cc6cd0291cbac0f77b2fac485a1e064b08a8789e2ac7b796e6e36529a40a781783bc0417893e01985ad5fa37487c233e5da8fb88eb64c73774de2a9173
6
+ metadata.gz: a7fa4a273ccddcdc65fd477b8ff59abde5951966b45ea43b78b257eb69e10a3dece8f62cb37d34b68f02201fcf0e2e2d471b835660ddb4bab9a1e1bc74d7c22b
7
+ data.tar.gz: 3a2de54bf09de5ffc15f31227a1458ad670ddccefa716e48c06ca4f98709d4de068f72be0be603c9e5bf60191b91a54f1e13ef617bdde833e98740c6ad34faf9
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- bigdecimal_version = '2.0.2'
3
+ bigdecimal_version = '2.0.3'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "bigdecimal"
@@ -77,7 +77,7 @@ static ID id_half;
77
77
  #define BASE1 (BASE/10)
78
78
 
79
79
  #ifndef DBLE_FIG
80
- #define DBLE_FIG (DBL_DIG+1) /* figure of double */
80
+ #define DBLE_FIG rmpd_double_figures() /* figure of double */
81
81
  #endif
82
82
 
83
83
  #ifndef RRATIONAL_ZERO_P
@@ -252,7 +252,7 @@ again:
252
252
  switch(TYPE(v)) {
253
253
  case T_FLOAT:
254
254
  if (prec < 0) goto unable_to_coerce_without_prec;
255
- if (prec > DBL_DIG+1) goto SomeOneMayDoIt;
255
+ if (prec > (long)DBLE_FIG) goto SomeOneMayDoIt;
256
256
  d = RFLOAT_VALUE(v);
257
257
  if (!isfinite(d)) {
258
258
  pv = VpCreateRbObject(1, NULL);
@@ -350,11 +350,13 @@ BigDecimal_double_fig(VALUE self)
350
350
  /* call-seq:
351
351
  * big_decimal.precs -> array
352
352
  *
353
- * Returns an Array of two Integer values.
353
+ * Returns an Array of two Integer values that represent platform-dependent
354
+ * internal storage properties.
354
355
  *
355
- * The first value is the current number of significant digits in the
356
- * BigDecimal. The second value is the maximum number of significant digits
357
- * for the BigDecimal.
356
+ * This method is deprecated and will be removed in the future.
357
+ * Instead, use BigDecimal#n_significant_digits for obtaining the number of
358
+ * significant digits in scientific notation, and BigDecimal#precision for
359
+ * obtaining the number of digits in decimal notation.
358
360
  *
359
361
  * BigDecimal('5').precs #=> [9, 18]
360
362
  */
@@ -366,12 +368,109 @@ BigDecimal_prec(VALUE self)
366
368
  Real *p;
367
369
  VALUE obj;
368
370
 
371
+ rb_category_warn(RB_WARN_CATEGORY_DEPRECATED,
372
+ "BigDecimal#precs is deprecated and will be removed in the future; "
373
+ "use BigDecimal#precision instead.");
374
+
369
375
  GUARD_OBJ(p, GetVpValue(self, 1));
370
376
  obj = rb_assoc_new(SIZET2NUM(p->Prec*VpBaseFig()),
371
377
  SIZET2NUM(p->MaxPrec*VpBaseFig()));
372
378
  return obj;
373
379
  }
374
380
 
381
+ /*
382
+ * call-seq:
383
+ * big_decimal.precision -> intreger
384
+ *
385
+ * Returns the number of decimal digits in this number.
386
+ *
387
+ * Example:
388
+ *
389
+ * BigDecimal("0").precision # => 0
390
+ * BigDecimal("1").precision # => 1
391
+ * BigDecimal("-1e20").precision # => 21
392
+ * BigDecimal("1e-20").precision # => 20
393
+ * BigDecimal("Infinity").precision # => 0
394
+ * BigDecimal("-Infinity").precision # => 0
395
+ * BigDecimal("NaN").precision # => 0
396
+ */
397
+ static VALUE
398
+ BigDecimal_precision(VALUE self)
399
+ {
400
+ ENTER(1);
401
+
402
+ Real *p;
403
+ GUARD_OBJ(p, GetVpValue(self, 1));
404
+
405
+ /*
406
+ * The most significant digit is frac[0], and the least significant digit is frac[Prec-1].
407
+ * When the exponent is zero, the decimal point is located just before frac[0].
408
+ * When the exponent is negative, the decimal point moves to leftward.
409
+ * Conversely, when the exponent is positive, the decimal point moves to rightward.
410
+ *
411
+ * | frac[0] frac[1] frac[2] . frac[3] frac[4] ... frac[Prec-1]
412
+ * |------------------------> exponent == 3
413
+ */
414
+
415
+ ssize_t ex = p->exponent;
416
+ ssize_t precision;
417
+ if (ex < 0) {
418
+ precision = (-ex + 1) * BASE_FIG; /* 1 is for p->frac[0] */
419
+ ex = 0;
420
+ }
421
+ else if (p->Prec > 0) {
422
+ BDIGIT x = p->frac[0];
423
+ for (precision = 0; x > 0; x /= 10) {
424
+ ++precision;
425
+ }
426
+ }
427
+
428
+ if (ex > (ssize_t)p->Prec) {
429
+ precision += (ex - 1) * BASE_FIG;
430
+ }
431
+ else if (p->Prec > 0) {
432
+ ssize_t n = (ssize_t)p->Prec - 1;
433
+ while (n > 0 && p->frac[n] == 0) --n;
434
+
435
+ precision += n * BASE_FIG;
436
+
437
+ if (ex < (ssize_t)p->Prec) {
438
+ BDIGIT x = p->frac[n];
439
+ for (; x > 0 && x % 10 == 0; x /= 10) {
440
+ --precision;
441
+ }
442
+ }
443
+ }
444
+
445
+ return SSIZET2NUM(precision);
446
+ }
447
+
448
+ static VALUE
449
+ BigDecimal_n_significant_digits(VALUE self)
450
+ {
451
+ ENTER(1);
452
+
453
+ Real *p;
454
+ GUARD_OBJ(p, GetVpValue(self, 1));
455
+
456
+ ssize_t n = p->Prec;
457
+ while (n > 0 && p->frac[n-1] == 0) --n;
458
+ if (n <= 0) {
459
+ return INT2FIX(0);
460
+ }
461
+
462
+ int nlz, ntz;
463
+
464
+ BDIGIT x = p->frac[0];
465
+ for (nlz = BASE_FIG; x > 0; x /= 10) --nlz;
466
+
467
+ x = p->frac[n-1];
468
+ for (ntz = 0; x > 0 && x % 10 == 0; x /= 10) ++ntz;
469
+
470
+ ssize_t n_digits = BASE_FIG * n - nlz - ntz;
471
+ return SSIZET2NUM(n_digits);
472
+ }
473
+
375
474
  /*
376
475
  * call-seq: hash
377
476
  *
@@ -899,7 +998,7 @@ BigDecimal_coerce(VALUE self, VALUE other)
899
998
  Real *b;
900
999
 
901
1000
  if (RB_TYPE_P(other, T_FLOAT)) {
902
- GUARD_OBJ(b, GetVpValueWithPrec(other, DBL_DIG+1, 1));
1001
+ GUARD_OBJ(b, GetVpValueWithPrec(other, DBLE_FIG, 1));
903
1002
  obj = rb_assoc_new(ToValue(b), self);
904
1003
  }
905
1004
  else {
@@ -957,7 +1056,7 @@ BigDecimal_add(VALUE self, VALUE r)
957
1056
 
958
1057
  GUARD_OBJ(a, GetVpValue(self, 1));
959
1058
  if (RB_TYPE_P(r, T_FLOAT)) {
960
- b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
1059
+ b = GetVpValueWithPrec(r, DBLE_FIG, 1);
961
1060
  }
962
1061
  else if (RB_TYPE_P(r, T_RATIONAL)) {
963
1062
  b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
@@ -1015,7 +1114,7 @@ BigDecimal_sub(VALUE self, VALUE r)
1015
1114
 
1016
1115
  GUARD_OBJ(a, GetVpValue(self,1));
1017
1116
  if (RB_TYPE_P(r, T_FLOAT)) {
1018
- b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
1117
+ b = GetVpValueWithPrec(r, DBLE_FIG, 1);
1019
1118
  }
1020
1119
  else if (RB_TYPE_P(r, T_RATIONAL)) {
1021
1120
  b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
@@ -1065,7 +1164,7 @@ BigDecimalCmp(VALUE self, VALUE r,char op)
1065
1164
  break;
1066
1165
 
1067
1166
  case T_FLOAT:
1068
- GUARD_OBJ(b, GetVpValueWithPrec(r, DBL_DIG+1, 0));
1167
+ GUARD_OBJ(b, GetVpValueWithPrec(r, DBLE_FIG, 0));
1069
1168
  break;
1070
1169
 
1071
1170
  case T_RATIONAL:
@@ -1278,7 +1377,7 @@ BigDecimal_mult(VALUE self, VALUE r)
1278
1377
 
1279
1378
  GUARD_OBJ(a, GetVpValue(self, 1));
1280
1379
  if (RB_TYPE_P(r, T_FLOAT)) {
1281
- b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
1380
+ b = GetVpValueWithPrec(r, DBLE_FIG, 1);
1282
1381
  }
1283
1382
  else if (RB_TYPE_P(r, T_RATIONAL)) {
1284
1383
  b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
@@ -1306,7 +1405,7 @@ BigDecimal_divide(Real **c, Real **res, Real **div, VALUE self, VALUE r)
1306
1405
 
1307
1406
  GUARD_OBJ(a, GetVpValue(self, 1));
1308
1407
  if (RB_TYPE_P(r, T_FLOAT)) {
1309
- b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
1408
+ b = GetVpValueWithPrec(r, DBLE_FIG, 1);
1310
1409
  }
1311
1410
  else if (RB_TYPE_P(r, T_RATIONAL)) {
1312
1411
  b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
@@ -1372,7 +1471,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
1372
1471
 
1373
1472
  GUARD_OBJ(a, GetVpValue(self, 1));
1374
1473
  if (RB_TYPE_P(r, T_FLOAT)) {
1375
- b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
1474
+ b = GetVpValueWithPrec(r, DBLE_FIG, 1);
1376
1475
  }
1377
1476
  else if (RB_TYPE_P(r, T_RATIONAL)) {
1378
1477
  b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
@@ -1473,7 +1572,7 @@ BigDecimal_divremain(VALUE self, VALUE r, Real **dv, Real **rv)
1473
1572
 
1474
1573
  GUARD_OBJ(a, GetVpValue(self, 1));
1475
1574
  if (RB_TYPE_P(r, T_FLOAT)) {
1476
- b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
1575
+ b = GetVpValueWithPrec(r, DBLE_FIG, 1);
1477
1576
  }
1478
1577
  else if (RB_TYPE_P(r, T_RATIONAL)) {
1479
1578
  b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
@@ -2685,7 +2784,7 @@ VpNewVarArg(int argc, VALUE *argv)
2685
2784
  VpDtoV(pv, d);
2686
2785
  return pv;
2687
2786
  }
2688
- if (mf > DBL_DIG+1) {
2787
+ if (mf > DBLE_FIG) {
2689
2788
  if (!exc) {
2690
2789
  return NULL;
2691
2790
  }
@@ -2980,7 +3079,7 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
2980
3079
  infinite = isinf(flo);
2981
3080
  nan = isnan(flo);
2982
3081
  if (!infinite && !nan) {
2983
- vx = GetVpValueWithPrec(x, DBL_DIG+1, 0);
3082
+ vx = GetVpValueWithPrec(x, DBLE_FIG, 0);
2984
3083
  }
2985
3084
  break;
2986
3085
 
@@ -3133,7 +3232,7 @@ get_vp_value:
3133
3232
  infinite = isinf(flo);
3134
3233
  nan = isnan(flo);
3135
3234
  if (!zero && !negative && !infinite && !nan) {
3136
- vx = GetVpValueWithPrec(x, DBL_DIG+1, 1);
3235
+ vx = GetVpValueWithPrec(x, DBLE_FIG, 1);
3137
3236
  }
3138
3237
  break;
3139
3238
 
@@ -3367,7 +3466,7 @@ Init_bigdecimal(void)
3367
3466
  rb_define_global_function("BigDecimal", f_BigDecimal, -1);
3368
3467
 
3369
3468
  /* Class methods */
3370
- rb_undef_method(CLASS_OF(rb_cBigDecimal), "allocate");
3469
+ rb_undef_alloc_func(rb_cBigDecimal);
3371
3470
  rb_undef_method(CLASS_OF(rb_cBigDecimal), "new");
3372
3471
  rb_define_singleton_method(rb_cBigDecimal, "interpret_loosely", BigDecimal_s_interpret_loosely, 1);
3373
3472
  rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
@@ -3501,6 +3600,8 @@ Init_bigdecimal(void)
3501
3600
 
3502
3601
  /* instance methods */
3503
3602
  rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
3603
+ rb_define_method(rb_cBigDecimal, "precision", BigDecimal_precision, 0);
3604
+ rb_define_method(rb_cBigDecimal, "n_significant_digits", BigDecimal_n_significant_digits, 0);
3504
3605
 
3505
3606
  rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
3506
3607
  rb_define_method(rb_cBigDecimal, "sub", BigDecimal_sub2, 2);
@@ -4023,7 +4124,7 @@ VpNumOfChars(Real *vp,const char *pszFmt)
4023
4124
  * by one BDIGIT word in the computer used.
4024
4125
  *
4025
4126
  * [Returns]
4026
- * 1+DBL_DIG ... OK
4127
+ * DBLE_FIG ... OK
4027
4128
  */
4028
4129
  VP_EXPORT size_t
4029
4130
  VpInit(BDIGIT BaseVal)
@@ -159,6 +159,10 @@ rb_sym2str(VALUE sym)
159
159
  # define vabs llabs
160
160
  #endif
161
161
 
162
+ #if !defined(HAVE_RB_CATEGORY_WARN) || !defined(HAVE_CONST_RB_WARN_CATEGORY_DEPRECATED)
163
+ # define rb_category_warn(category, ...) rb_warn(__VA_ARGS__)
164
+ #endif
165
+
162
166
  extern VALUE rb_cBigDecimal;
163
167
 
164
168
  #if 0 || SIZEOF_BDIGITS >= 16
@@ -42,6 +42,8 @@ have_func("rb_complex_imag", "ruby.h")
42
42
  have_func("rb_array_const_ptr", "ruby.h")
43
43
  have_func("rb_sym2str", "ruby.h")
44
44
  have_func("rb_opts_exception_p", "ruby.h")
45
+ have_func("rb_category_warn", "ruby.h")
46
+ have_const("RB_WARN_CATEGORY_DEPRECATED", "ruby.h")
45
47
 
46
48
  if File.file?(File.expand_path('../lib/bigdecimal.rb', __FILE__))
47
49
  bigdecimal_rb = "$(srcdir)/lib/bigdecimal.rb"
@@ -43,7 +43,7 @@ class Float < Numeric
43
43
  #
44
44
  # See also BigDecimal::new.
45
45
  #
46
- def to_d(precision=Float::DIG)
46
+ def to_d(precision=Float::DIG+1)
47
47
  BigDecimal(self, precision)
48
48
  end
49
49
  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: 2.0.2
4
+ version: 2.0.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: 2020-12-15 00:00:00.000000000 Z
13
+ date: 2020-12-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  requirements: []
112
- rubygems_version: 3.1.4
112
+ rubygems_version: 3.2.2
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: Arbitrary-precision decimal floating-point number library.