bigdecimal 2.0.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bigdecimal.gemspec +1 -1
- data/ext/bigdecimal/bigdecimal.c +132 -20
- data/ext/bigdecimal/bigdecimal.h +4 -0
- data/ext/bigdecimal/extconf.rb +2 -0
- data/lib/bigdecimal/util.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b3519c64aa42c80e19107fc6d5d78d81385d7d71b9c09abef67c4e4c6a0bcef
|
4
|
+
data.tar.gz: 4ab9cb50f0a24014262635c07ecb42e6891326b49de50f262550e22d00c586ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e4aa6023012625b46f68a9e58d79a5ea0aa2c579ddb4245e0753a01118d62bd75fa5a708535346ab295619aa2ad9974a929189a83a00d56321c295a1ec8498c
|
7
|
+
data.tar.gz: 5717f808a7a56ae06b5060a3752fcaf3a9b47dca9dceb8e6822e603ec20f0296b711df04d1454a309ac6720d4af60e9b4e58f3477133f7a66e20eab75207a70e
|
data/bigdecimal.gemspec
CHANGED
data/ext/bigdecimal/bigdecimal.c
CHANGED
@@ -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 (
|
80
|
+
#define DBLE_FIG rmpd_double_figures() /* figure of double */
|
81
81
|
#endif
|
82
82
|
|
83
83
|
#ifndef RRATIONAL_ZERO_P
|
@@ -189,11 +189,16 @@ BigDecimal_memsize(const void *ptr)
|
|
189
189
|
return (sizeof(*pv) + pv->MaxPrec * sizeof(BDIGIT));
|
190
190
|
}
|
191
191
|
|
192
|
+
#ifndef HAVE_RB_EXT_RACTOR_SAFE
|
193
|
+
# undef RUBY_TYPED_FROZEN_SHAREABLE
|
194
|
+
# define RUBY_TYPED_FROZEN_SHAREABLE 0
|
195
|
+
#endif
|
196
|
+
|
192
197
|
static const rb_data_type_t BigDecimal_data_type = {
|
193
198
|
"BigDecimal",
|
194
199
|
{ 0, BigDecimal_delete, BigDecimal_memsize, },
|
195
200
|
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
196
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
201
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE
|
197
202
|
#endif
|
198
203
|
};
|
199
204
|
|
@@ -252,7 +257,7 @@ again:
|
|
252
257
|
switch(TYPE(v)) {
|
253
258
|
case T_FLOAT:
|
254
259
|
if (prec < 0) goto unable_to_coerce_without_prec;
|
255
|
-
if (prec >
|
260
|
+
if (prec > (long)DBLE_FIG) goto SomeOneMayDoIt;
|
256
261
|
d = RFLOAT_VALUE(v);
|
257
262
|
if (!isfinite(d)) {
|
258
263
|
pv = VpCreateRbObject(1, NULL);
|
@@ -350,11 +355,13 @@ BigDecimal_double_fig(VALUE self)
|
|
350
355
|
/* call-seq:
|
351
356
|
* big_decimal.precs -> array
|
352
357
|
*
|
353
|
-
* Returns an Array of two Integer values
|
358
|
+
* Returns an Array of two Integer values that represent platform-dependent
|
359
|
+
* internal storage properties.
|
354
360
|
*
|
355
|
-
*
|
356
|
-
*
|
357
|
-
*
|
361
|
+
* This method is deprecated and will be removed in the future.
|
362
|
+
* Instead, use BigDecimal#n_significant_digits for obtaining the number of
|
363
|
+
* significant digits in scientific notation, and BigDecimal#precision for
|
364
|
+
* obtaining the number of digits in decimal notation.
|
358
365
|
*
|
359
366
|
* BigDecimal('5').precs #=> [9, 18]
|
360
367
|
*/
|
@@ -366,12 +373,109 @@ BigDecimal_prec(VALUE self)
|
|
366
373
|
Real *p;
|
367
374
|
VALUE obj;
|
368
375
|
|
376
|
+
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED,
|
377
|
+
"BigDecimal#precs is deprecated and will be removed in the future; "
|
378
|
+
"use BigDecimal#precision instead.");
|
379
|
+
|
369
380
|
GUARD_OBJ(p, GetVpValue(self, 1));
|
370
381
|
obj = rb_assoc_new(SIZET2NUM(p->Prec*VpBaseFig()),
|
371
382
|
SIZET2NUM(p->MaxPrec*VpBaseFig()));
|
372
383
|
return obj;
|
373
384
|
}
|
374
385
|
|
386
|
+
/*
|
387
|
+
* call-seq:
|
388
|
+
* big_decimal.precision -> intreger
|
389
|
+
*
|
390
|
+
* Returns the number of decimal digits in this number.
|
391
|
+
*
|
392
|
+
* Example:
|
393
|
+
*
|
394
|
+
* BigDecimal("0").precision # => 0
|
395
|
+
* BigDecimal("1").precision # => 1
|
396
|
+
* BigDecimal("-1e20").precision # => 21
|
397
|
+
* BigDecimal("1e-20").precision # => 20
|
398
|
+
* BigDecimal("Infinity").precision # => 0
|
399
|
+
* BigDecimal("-Infinity").precision # => 0
|
400
|
+
* BigDecimal("NaN").precision # => 0
|
401
|
+
*/
|
402
|
+
static VALUE
|
403
|
+
BigDecimal_precision(VALUE self)
|
404
|
+
{
|
405
|
+
ENTER(1);
|
406
|
+
|
407
|
+
Real *p;
|
408
|
+
GUARD_OBJ(p, GetVpValue(self, 1));
|
409
|
+
|
410
|
+
/*
|
411
|
+
* The most significant digit is frac[0], and the least significant digit is frac[Prec-1].
|
412
|
+
* When the exponent is zero, the decimal point is located just before frac[0].
|
413
|
+
* When the exponent is negative, the decimal point moves to leftward.
|
414
|
+
* Conversely, when the exponent is positive, the decimal point moves to rightward.
|
415
|
+
*
|
416
|
+
* | frac[0] frac[1] frac[2] . frac[3] frac[4] ... frac[Prec-1]
|
417
|
+
* |------------------------> exponent == 3
|
418
|
+
*/
|
419
|
+
|
420
|
+
ssize_t ex = p->exponent;
|
421
|
+
ssize_t precision;
|
422
|
+
if (ex < 0) {
|
423
|
+
precision = (-ex + 1) * BASE_FIG; /* 1 is for p->frac[0] */
|
424
|
+
ex = 0;
|
425
|
+
}
|
426
|
+
else if (p->Prec > 0) {
|
427
|
+
BDIGIT x = p->frac[0];
|
428
|
+
for (precision = 0; x > 0; x /= 10) {
|
429
|
+
++precision;
|
430
|
+
}
|
431
|
+
}
|
432
|
+
|
433
|
+
if (ex > (ssize_t)p->Prec) {
|
434
|
+
precision += (ex - 1) * BASE_FIG;
|
435
|
+
}
|
436
|
+
else if (p->Prec > 0) {
|
437
|
+
ssize_t n = (ssize_t)p->Prec - 1;
|
438
|
+
while (n > 0 && p->frac[n] == 0) --n;
|
439
|
+
|
440
|
+
precision += n * BASE_FIG;
|
441
|
+
|
442
|
+
if (ex < (ssize_t)p->Prec) {
|
443
|
+
BDIGIT x = p->frac[n];
|
444
|
+
for (; x > 0 && x % 10 == 0; x /= 10) {
|
445
|
+
--precision;
|
446
|
+
}
|
447
|
+
}
|
448
|
+
}
|
449
|
+
|
450
|
+
return SSIZET2NUM(precision);
|
451
|
+
}
|
452
|
+
|
453
|
+
static VALUE
|
454
|
+
BigDecimal_n_significant_digits(VALUE self)
|
455
|
+
{
|
456
|
+
ENTER(1);
|
457
|
+
|
458
|
+
Real *p;
|
459
|
+
GUARD_OBJ(p, GetVpValue(self, 1));
|
460
|
+
|
461
|
+
ssize_t n = p->Prec;
|
462
|
+
while (n > 0 && p->frac[n-1] == 0) --n;
|
463
|
+
if (n <= 0) {
|
464
|
+
return INT2FIX(0);
|
465
|
+
}
|
466
|
+
|
467
|
+
int nlz, ntz;
|
468
|
+
|
469
|
+
BDIGIT x = p->frac[0];
|
470
|
+
for (nlz = BASE_FIG; x > 0; x /= 10) --nlz;
|
471
|
+
|
472
|
+
x = p->frac[n-1];
|
473
|
+
for (ntz = 0; x > 0 && x % 10 == 0; x /= 10) ++ntz;
|
474
|
+
|
475
|
+
ssize_t n_digits = BASE_FIG * n - nlz - ntz;
|
476
|
+
return SSIZET2NUM(n_digits);
|
477
|
+
}
|
478
|
+
|
375
479
|
/*
|
376
480
|
* call-seq: hash
|
377
481
|
*
|
@@ -899,7 +1003,7 @@ BigDecimal_coerce(VALUE self, VALUE other)
|
|
899
1003
|
Real *b;
|
900
1004
|
|
901
1005
|
if (RB_TYPE_P(other, T_FLOAT)) {
|
902
|
-
GUARD_OBJ(b, GetVpValueWithPrec(other,
|
1006
|
+
GUARD_OBJ(b, GetVpValueWithPrec(other, DBLE_FIG, 1));
|
903
1007
|
obj = rb_assoc_new(ToValue(b), self);
|
904
1008
|
}
|
905
1009
|
else {
|
@@ -957,7 +1061,7 @@ BigDecimal_add(VALUE self, VALUE r)
|
|
957
1061
|
|
958
1062
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
959
1063
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
960
|
-
b = GetVpValueWithPrec(r,
|
1064
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
961
1065
|
}
|
962
1066
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
963
1067
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1015,7 +1119,7 @@ BigDecimal_sub(VALUE self, VALUE r)
|
|
1015
1119
|
|
1016
1120
|
GUARD_OBJ(a, GetVpValue(self,1));
|
1017
1121
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1018
|
-
b = GetVpValueWithPrec(r,
|
1122
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1019
1123
|
}
|
1020
1124
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1021
1125
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1065,7 +1169,7 @@ BigDecimalCmp(VALUE self, VALUE r,char op)
|
|
1065
1169
|
break;
|
1066
1170
|
|
1067
1171
|
case T_FLOAT:
|
1068
|
-
GUARD_OBJ(b, GetVpValueWithPrec(r,
|
1172
|
+
GUARD_OBJ(b, GetVpValueWithPrec(r, DBLE_FIG, 0));
|
1069
1173
|
break;
|
1070
1174
|
|
1071
1175
|
case T_RATIONAL:
|
@@ -1278,7 +1382,7 @@ BigDecimal_mult(VALUE self, VALUE r)
|
|
1278
1382
|
|
1279
1383
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1280
1384
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1281
|
-
|
1385
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1282
1386
|
}
|
1283
1387
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1284
1388
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1306,7 +1410,7 @@ BigDecimal_divide(Real **c, Real **res, Real **div, VALUE self, VALUE r)
|
|
1306
1410
|
|
1307
1411
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1308
1412
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1309
|
-
|
1413
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1310
1414
|
}
|
1311
1415
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1312
1416
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1372,7 +1476,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
|
|
1372
1476
|
|
1373
1477
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1374
1478
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1375
|
-
b = GetVpValueWithPrec(r,
|
1479
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1376
1480
|
}
|
1377
1481
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1378
1482
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1473,7 +1577,7 @@ BigDecimal_divremain(VALUE self, VALUE r, Real **dv, Real **rv)
|
|
1473
1577
|
|
1474
1578
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1475
1579
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1476
|
-
b = GetVpValueWithPrec(r,
|
1580
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1477
1581
|
}
|
1478
1582
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1479
1583
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -2685,7 +2789,7 @@ VpNewVarArg(int argc, VALUE *argv)
|
|
2685
2789
|
VpDtoV(pv, d);
|
2686
2790
|
return pv;
|
2687
2791
|
}
|
2688
|
-
if (mf >
|
2792
|
+
if (mf > DBLE_FIG) {
|
2689
2793
|
if (!exc) {
|
2690
2794
|
return NULL;
|
2691
2795
|
}
|
@@ -2980,7 +3084,7 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2980
3084
|
infinite = isinf(flo);
|
2981
3085
|
nan = isnan(flo);
|
2982
3086
|
if (!infinite && !nan) {
|
2983
|
-
vx = GetVpValueWithPrec(x,
|
3087
|
+
vx = GetVpValueWithPrec(x, DBLE_FIG, 0);
|
2984
3088
|
}
|
2985
3089
|
break;
|
2986
3090
|
|
@@ -3133,7 +3237,7 @@ get_vp_value:
|
|
3133
3237
|
infinite = isinf(flo);
|
3134
3238
|
nan = isnan(flo);
|
3135
3239
|
if (!zero && !negative && !infinite && !nan) {
|
3136
|
-
vx = GetVpValueWithPrec(x,
|
3240
|
+
vx = GetVpValueWithPrec(x, DBLE_FIG, 1);
|
3137
3241
|
}
|
3138
3242
|
break;
|
3139
3243
|
|
@@ -3351,6 +3455,9 @@ get_vp_value:
|
|
3351
3455
|
void
|
3352
3456
|
Init_bigdecimal(void)
|
3353
3457
|
{
|
3458
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
3459
|
+
rb_ext_ractor_safe(true);
|
3460
|
+
#endif
|
3354
3461
|
VALUE arg;
|
3355
3462
|
|
3356
3463
|
id_BigDecimal_exception_mode = rb_intern_const("BigDecimal.exception_mode");
|
@@ -3367,7 +3474,7 @@ Init_bigdecimal(void)
|
|
3367
3474
|
rb_define_global_function("BigDecimal", f_BigDecimal, -1);
|
3368
3475
|
|
3369
3476
|
/* Class methods */
|
3370
|
-
|
3477
|
+
rb_undef_alloc_func(rb_cBigDecimal);
|
3371
3478
|
rb_undef_method(CLASS_OF(rb_cBigDecimal), "new");
|
3372
3479
|
rb_define_singleton_method(rb_cBigDecimal, "interpret_loosely", BigDecimal_s_interpret_loosely, 1);
|
3373
3480
|
rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
|
@@ -3501,6 +3608,8 @@ Init_bigdecimal(void)
|
|
3501
3608
|
|
3502
3609
|
/* instance methods */
|
3503
3610
|
rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
|
3611
|
+
rb_define_method(rb_cBigDecimal, "precision", BigDecimal_precision, 0);
|
3612
|
+
rb_define_method(rb_cBigDecimal, "n_significant_digits", BigDecimal_n_significant_digits, 0);
|
3504
3613
|
|
3505
3614
|
rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
|
3506
3615
|
rb_define_method(rb_cBigDecimal, "sub", BigDecimal_sub2, 2);
|
@@ -3617,6 +3726,9 @@ static void VpFormatSt(char *psz, size_t fFmt);
|
|
3617
3726
|
static int VpRdup(Real *m, size_t ind_m);
|
3618
3727
|
|
3619
3728
|
#ifdef BIGDECIMAL_DEBUG
|
3729
|
+
# ifdef HAVE_RB_EXT_RACTOR_SAFE
|
3730
|
+
# error Need to make rewiting gnAlloc atomic
|
3731
|
+
# endif
|
3620
3732
|
static int gnAlloc = 0; /* Memory allocation counter */
|
3621
3733
|
#endif /* BIGDECIMAL_DEBUG */
|
3622
3734
|
|
@@ -4023,7 +4135,7 @@ VpNumOfChars(Real *vp,const char *pszFmt)
|
|
4023
4135
|
* by one BDIGIT word in the computer used.
|
4024
4136
|
*
|
4025
4137
|
* [Returns]
|
4026
|
-
*
|
4138
|
+
* DBLE_FIG ... OK
|
4027
4139
|
*/
|
4028
4140
|
VP_EXPORT size_t
|
4029
4141
|
VpInit(BDIGIT BaseVal)
|
data/ext/bigdecimal/bigdecimal.h
CHANGED
@@ -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
|
data/ext/bigdecimal/extconf.rb
CHANGED
@@ -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"
|
data/lib/bigdecimal/util.rb
CHANGED
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:
|
4
|
+
version: 3.0.0
|
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-
|
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.
|
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.
|