bigdecimal 2.0.0 → 3.0.2
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 +4 -4
- data/bigdecimal.gemspec +3 -3
- data/ext/bigdecimal/bigdecimal.c +158 -33
- data/ext/bigdecimal/bigdecimal.h +4 -0
- data/ext/bigdecimal/extconf.rb +2 -0
- data/lib/bigdecimal/util.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94cacf0d3ea1fe8d70fc866530799e00fe34d6c86c9497a77c2ee8b1f0adddab
|
4
|
+
data.tar.gz: 2d9503ddea18e93370340991789e2f3bb6690e4449e6805483e3773b7891bc35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfbb161000111a0373c2981fe70467d02a89fa15d212ec6c1ba8cde81fc8db02d071aed10ba55af71cf4b39653b40f7a34fcb54b027aae3e71908e5030cb4192
|
7
|
+
data.tar.gz: edbd1fc536b280ff310f3d436e5e204ca17fe00a09c61211585acb7a270eae1562d3cc353778ca13beac8b09d74c03951ff471276beafa2fe3156826bb03f496
|
data/bigdecimal.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
bigdecimal_version = '
|
3
|
+
bigdecimal_version = '3.0.2'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "bigdecimal"
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.summary = "Arbitrary-precision decimal floating-point number library."
|
12
12
|
s.description = "This library provides arbitrary-precision decimal floating-point number class."
|
13
13
|
s.homepage = "https://github.com/ruby/bigdecimal"
|
14
|
-
s.license = "
|
14
|
+
s.license = "Ruby"
|
15
15
|
|
16
16
|
s.require_paths = %w[lib]
|
17
17
|
s.extensions = %w[ext/bigdecimal/extconf.rb]
|
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
|
33
33
|
s.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
34
34
|
|
35
|
-
s.add_development_dependency "rake", "
|
35
|
+
s.add_development_dependency "rake", ">= 12.3.3"
|
36
36
|
s.add_development_dependency "rake-compiler", ">= 0.9"
|
37
37
|
s.add_development_dependency "minitest", "< 5.0.0"
|
38
38
|
s.add_development_dependency "pry"
|
data/ext/bigdecimal/bigdecimal.c
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
#include "ruby/util.h"
|
15
15
|
|
16
16
|
#ifndef BIGDECIMAL_DEBUG
|
17
|
+
# undef NDEBUG
|
17
18
|
# define NDEBUG
|
18
19
|
#endif
|
19
20
|
#include <assert.h>
|
@@ -24,7 +25,6 @@
|
|
24
25
|
#include <string.h>
|
25
26
|
#include <errno.h>
|
26
27
|
#include <math.h>
|
27
|
-
#include "math.h"
|
28
28
|
|
29
29
|
#ifdef HAVE_IEEEFP_H
|
30
30
|
#include <ieeefp.h>
|
@@ -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
|
-
obj = rb_assoc_new(
|
371
|
-
|
381
|
+
obj = rb_assoc_new(SIZET2NUM(p->Prec*VpBaseFig()),
|
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);
|
@@ -1791,10 +1895,10 @@ BigDecimal_fix(VALUE self)
|
|
1791
1895
|
* more than that many digits.
|
1792
1896
|
*
|
1793
1897
|
* If n is specified and negative, at least that many digits to the left of the
|
1794
|
-
* decimal point will be 0 in the result.
|
1898
|
+
* decimal point will be 0 in the result, and return value will be an Integer.
|
1795
1899
|
*
|
1796
1900
|
* BigDecimal('3.14159').round(3) #=> 3.142
|
1797
|
-
* BigDecimal('13345.234').round(-2) #=> 13300
|
1901
|
+
* BigDecimal('13345.234').round(-2) #=> 13300
|
1798
1902
|
*
|
1799
1903
|
* The value of the optional mode argument can be used to determine how
|
1800
1904
|
* rounding is performed; see BigDecimal.mode.
|
@@ -1807,6 +1911,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1807
1911
|
int iLoc = 0;
|
1808
1912
|
VALUE vLoc;
|
1809
1913
|
VALUE vRound;
|
1914
|
+
int round_to_int = 0;
|
1810
1915
|
size_t mx, pl;
|
1811
1916
|
|
1812
1917
|
unsigned short sw = VpGetRoundMode();
|
@@ -1814,6 +1919,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1814
1919
|
switch (rb_scan_args(argc, argv, "02", &vLoc, &vRound)) {
|
1815
1920
|
case 0:
|
1816
1921
|
iLoc = 0;
|
1922
|
+
round_to_int = 1;
|
1817
1923
|
break;
|
1818
1924
|
case 1:
|
1819
1925
|
if (RB_TYPE_P(vLoc, T_HASH)) {
|
@@ -1821,6 +1927,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1821
1927
|
}
|
1822
1928
|
else {
|
1823
1929
|
iLoc = NUM2INT(vLoc);
|
1930
|
+
if (iLoc < 1) round_to_int = 1;
|
1824
1931
|
}
|
1825
1932
|
break;
|
1826
1933
|
case 2:
|
@@ -1842,7 +1949,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1842
1949
|
GUARD_OBJ(c, VpCreateRbObject(mx, "0"));
|
1843
1950
|
VpSetPrecLimit(pl);
|
1844
1951
|
VpActiveRound(c, a, sw, iLoc);
|
1845
|
-
if (
|
1952
|
+
if (round_to_int) {
|
1846
1953
|
return BigDecimal_to_i(ToValue(c));
|
1847
1954
|
}
|
1848
1955
|
return ToValue(c);
|
@@ -2091,7 +2198,7 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2091
2198
|
nc += (nc + mc - 1) / mc + 1;
|
2092
2199
|
}
|
2093
2200
|
|
2094
|
-
str =
|
2201
|
+
str = rb_usascii_str_new(0, nc);
|
2095
2202
|
psz = RSTRING_PTR(str);
|
2096
2203
|
|
2097
2204
|
if (fmt) {
|
@@ -2156,7 +2263,7 @@ BigDecimal_split(VALUE self)
|
|
2156
2263
|
rb_ary_push(obj, str);
|
2157
2264
|
rb_str_resize(str, strlen(psz1));
|
2158
2265
|
rb_ary_push(obj, INT2FIX(10));
|
2159
|
-
rb_ary_push(obj,
|
2266
|
+
rb_ary_push(obj, SSIZET2NUM(e));
|
2160
2267
|
return obj;
|
2161
2268
|
}
|
2162
2269
|
|
@@ -2169,7 +2276,7 @@ static VALUE
|
|
2169
2276
|
BigDecimal_exponent(VALUE self)
|
2170
2277
|
{
|
2171
2278
|
ssize_t e = VpExponent10(GetVpValue(self, 1));
|
2172
|
-
return
|
2279
|
+
return SSIZET2NUM(e);
|
2173
2280
|
}
|
2174
2281
|
|
2175
2282
|
/* Returns a string representation of self.
|
@@ -2362,7 +2469,10 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2362
2469
|
}
|
2363
2470
|
goto retry;
|
2364
2471
|
}
|
2365
|
-
|
2472
|
+
if (NIL_P(prec)) {
|
2473
|
+
n += DBLE_FIG;
|
2474
|
+
}
|
2475
|
+
exp = GetVpValueWithPrec(vexp, DBLE_FIG, 1);
|
2366
2476
|
break;
|
2367
2477
|
|
2368
2478
|
case T_RATIONAL:
|
@@ -2377,6 +2487,9 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2377
2487
|
goto retry;
|
2378
2488
|
}
|
2379
2489
|
exp = GetVpValueWithPrec(vexp, n, 1);
|
2490
|
+
if (NIL_P(prec)) {
|
2491
|
+
n += n;
|
2492
|
+
}
|
2380
2493
|
break;
|
2381
2494
|
|
2382
2495
|
case T_DATA:
|
@@ -2387,6 +2500,10 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2387
2500
|
vexp = BigDecimal_to_i(vexp);
|
2388
2501
|
goto retry;
|
2389
2502
|
}
|
2503
|
+
if (NIL_P(prec)) {
|
2504
|
+
GUARD_OBJ(y, GetVpValue(vexp, 1));
|
2505
|
+
n += y->Prec*VpBaseFig();
|
2506
|
+
}
|
2390
2507
|
exp = DATA_PTR(vexp);
|
2391
2508
|
break;
|
2392
2509
|
}
|
@@ -2672,7 +2789,7 @@ VpNewVarArg(int argc, VALUE *argv)
|
|
2672
2789
|
VpDtoV(pv, d);
|
2673
2790
|
return pv;
|
2674
2791
|
}
|
2675
|
-
if (mf >
|
2792
|
+
if (mf > DBLE_FIG) {
|
2676
2793
|
if (!exc) {
|
2677
2794
|
return NULL;
|
2678
2795
|
}
|
@@ -2802,7 +2919,7 @@ static VALUE
|
|
2802
2919
|
BigDecimal_limit(int argc, VALUE *argv, VALUE self)
|
2803
2920
|
{
|
2804
2921
|
VALUE nFig;
|
2805
|
-
VALUE nCur =
|
2922
|
+
VALUE nCur = SIZET2NUM(VpGetPrecLimit());
|
2806
2923
|
|
2807
2924
|
if (rb_scan_args(argc, argv, "01", &nFig) == 1) {
|
2808
2925
|
int nf;
|
@@ -2967,7 +3084,7 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2967
3084
|
infinite = isinf(flo);
|
2968
3085
|
nan = isnan(flo);
|
2969
3086
|
if (!infinite && !nan) {
|
2970
|
-
vx = GetVpValueWithPrec(x,
|
3087
|
+
vx = GetVpValueWithPrec(x, DBLE_FIG, 0);
|
2971
3088
|
}
|
2972
3089
|
break;
|
2973
3090
|
|
@@ -3120,7 +3237,7 @@ get_vp_value:
|
|
3120
3237
|
infinite = isinf(flo);
|
3121
3238
|
nan = isnan(flo);
|
3122
3239
|
if (!zero && !negative && !infinite && !nan) {
|
3123
|
-
vx = GetVpValueWithPrec(x,
|
3240
|
+
vx = GetVpValueWithPrec(x, DBLE_FIG, 1);
|
3124
3241
|
}
|
3125
3242
|
break;
|
3126
3243
|
|
@@ -3338,6 +3455,9 @@ get_vp_value:
|
|
3338
3455
|
void
|
3339
3456
|
Init_bigdecimal(void)
|
3340
3457
|
{
|
3458
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
3459
|
+
rb_ext_ractor_safe(true);
|
3460
|
+
#endif
|
3341
3461
|
VALUE arg;
|
3342
3462
|
|
3343
3463
|
id_BigDecimal_exception_mode = rb_intern_const("BigDecimal.exception_mode");
|
@@ -3354,7 +3474,7 @@ Init_bigdecimal(void)
|
|
3354
3474
|
rb_define_global_function("BigDecimal", f_BigDecimal, -1);
|
3355
3475
|
|
3356
3476
|
/* Class methods */
|
3357
|
-
|
3477
|
+
rb_undef_alloc_func(rb_cBigDecimal);
|
3358
3478
|
rb_undef_method(CLASS_OF(rb_cBigDecimal), "new");
|
3359
3479
|
rb_define_singleton_method(rb_cBigDecimal, "interpret_loosely", BigDecimal_s_interpret_loosely, 1);
|
3360
3480
|
rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
|
@@ -3488,6 +3608,8 @@ Init_bigdecimal(void)
|
|
3488
3608
|
|
3489
3609
|
/* instance methods */
|
3490
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);
|
3491
3613
|
|
3492
3614
|
rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
|
3493
3615
|
rb_define_method(rb_cBigDecimal, "sub", BigDecimal_sub2, 2);
|
@@ -3604,6 +3726,9 @@ static void VpFormatSt(char *psz, size_t fFmt);
|
|
3604
3726
|
static int VpRdup(Real *m, size_t ind_m);
|
3605
3727
|
|
3606
3728
|
#ifdef BIGDECIMAL_DEBUG
|
3729
|
+
# ifdef HAVE_RB_EXT_RACTOR_SAFE
|
3730
|
+
# error Need to make rewiting gnAlloc atomic
|
3731
|
+
# endif
|
3607
3732
|
static int gnAlloc = 0; /* Memory allocation counter */
|
3608
3733
|
#endif /* BIGDECIMAL_DEBUG */
|
3609
3734
|
|
@@ -4010,7 +4135,7 @@ VpNumOfChars(Real *vp,const char *pszFmt)
|
|
4010
4135
|
* by one BDIGIT word in the computer used.
|
4011
4136
|
*
|
4012
4137
|
* [Returns]
|
4013
|
-
*
|
4138
|
+
* DBLE_FIG ... OK
|
4014
4139
|
*/
|
4015
4140
|
VP_EXPORT size_t
|
4016
4141
|
VpInit(BDIGIT BaseVal)
|
@@ -4180,7 +4305,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4180
4305
|
/* at least mx digits. */
|
4181
4306
|
/* szVal==NULL ==> allocate zero value. */
|
4182
4307
|
vp = VpAllocReal(mx);
|
4183
|
-
/* xmalloc()
|
4308
|
+
/* xmalloc() always returns(or throw interruption) */
|
4184
4309
|
vp->MaxPrec = mx; /* set max precision */
|
4185
4310
|
VpSetZero(vp, 1); /* initialize vp to zero. */
|
4186
4311
|
return vp;
|
@@ -4356,7 +4481,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4356
4481
|
nalloc = Max(nalloc, mx);
|
4357
4482
|
mx = nalloc;
|
4358
4483
|
vp = VpAllocReal(mx);
|
4359
|
-
/* xmalloc()
|
4484
|
+
/* xmalloc() always returns(or throw interruption) */
|
4360
4485
|
vp->MaxPrec = mx; /* set max precision */
|
4361
4486
|
VpSetZero(vp, sign);
|
4362
4487
|
VpCtoV(vp, psz, ni, psz + ipf, nf, psz + ipe, ne);
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenta Murata
|
@@ -10,22 +10,22 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-05-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 12.3.3
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 12.3.3
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rake-compiler
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,7 +92,7 @@ files:
|
|
92
92
|
- sample/pi.rb
|
93
93
|
homepage: https://github.com/ruby/bigdecimal
|
94
94
|
licenses:
|
95
|
-
-
|
95
|
+
- Ruby
|
96
96
|
metadata: {}
|
97
97
|
post_install_message:
|
98
98
|
rdoc_options: []
|
@@ -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.3
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
115
|
summary: Arbitrary-precision decimal floating-point number library.
|