bigdecimal 1.4.4 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bigdecimal.gemspec +4 -5
- data/ext/bigdecimal/bigdecimal.c +229 -73
- data/ext/bigdecimal/bigdecimal.h +4 -0
- data/ext/bigdecimal/extconf.rb +6 -0
- data/lib/bigdecimal/jacobian.rb +3 -4
- data/lib/bigdecimal/util.rb +34 -1
- data/lib/bigdecimal.rb +1 -22
- metadata +9 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef063cb7c648ba239e4179669ed4d410d9d160e293377ce4b1bdb73ec68366cb
|
4
|
+
data.tar.gz: d0e2d57a69c624ba2ef446c52fc19f889721809e7f6933ed8f0db684e3f9c1a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7fa4a273ccddcdc65fd477b8ff59abde5951966b45ea43b78b257eb69e10a3dece8f62cb37d34b68f02201fcf0e2e2d471b835660ddb4bab9a1e1bc74d7c22b
|
7
|
+
data.tar.gz: 3a2de54bf09de5ffc15f31227a1458ad670ddccefa716e48c06ca4f98709d4de068f72be0be603c9e5bf60191b91a54f1e13ef617bdde833e98740c6ad34faf9
|
data/bigdecimal.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
bigdecimal_version = '
|
3
|
+
bigdecimal_version = '2.0.3'
|
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]
|
@@ -30,11 +30,10 @@ Gem::Specification.new do |s|
|
|
30
30
|
sample/pi.rb
|
31
31
|
]
|
32
32
|
|
33
|
-
s.required_ruby_version = Gem::Requirement.new(">= 2.
|
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
|
-
s.add_development_dependency "rake-compiler-dock", ">= 0.6.1"
|
38
37
|
s.add_development_dependency "minitest", "< 5.0.0"
|
39
38
|
s.add_development_dependency "pry"
|
40
39
|
end
|
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
|
@@ -127,6 +127,30 @@ rb_rational_den(VALUE rat)
|
|
127
127
|
}
|
128
128
|
#endif
|
129
129
|
|
130
|
+
#ifndef HAVE_RB_COMPLEX_REAL
|
131
|
+
static inline VALUE
|
132
|
+
rb_complex_real(VALUE cmp)
|
133
|
+
{
|
134
|
+
#ifdef HAVE_TYPE_STRUCT_RCOMPLEX
|
135
|
+
return RCOMPLEX(cmp)->real;
|
136
|
+
#else
|
137
|
+
return rb_funcall(cmp, rb_intern("real"), 0);
|
138
|
+
#endif
|
139
|
+
}
|
140
|
+
#endif
|
141
|
+
|
142
|
+
#ifndef HAVE_RB_COMPLEX_IMAG
|
143
|
+
static inline VALUE
|
144
|
+
rb_complex_imag(VALUE cmp)
|
145
|
+
{
|
146
|
+
#ifdef HAVE_TYPE_STRUCT_RCOMPLEX
|
147
|
+
return RCOMPLEX(cmp)->imag;
|
148
|
+
#else
|
149
|
+
return rb_funcall(cmp, rb_intern("imag"), 0);
|
150
|
+
#endif
|
151
|
+
}
|
152
|
+
#endif
|
153
|
+
|
130
154
|
#define BIGDECIMAL_POSITIVE_P(bd) ((bd)->sign > 0)
|
131
155
|
#define BIGDECIMAL_NEGATIVE_P(bd) ((bd)->sign < 0)
|
132
156
|
|
@@ -228,7 +252,7 @@ again:
|
|
228
252
|
switch(TYPE(v)) {
|
229
253
|
case T_FLOAT:
|
230
254
|
if (prec < 0) goto unable_to_coerce_without_prec;
|
231
|
-
if (prec >
|
255
|
+
if (prec > (long)DBLE_FIG) goto SomeOneMayDoIt;
|
232
256
|
d = RFLOAT_VALUE(v);
|
233
257
|
if (!isfinite(d)) {
|
234
258
|
pv = VpCreateRbObject(1, NULL);
|
@@ -276,7 +300,6 @@ again:
|
|
276
300
|
#ifdef ENABLE_NUMERIC_STRING
|
277
301
|
case T_STRING:
|
278
302
|
StringValueCStr(v);
|
279
|
-
rb_check_safe_obj(v);
|
280
303
|
return VpCreateRbObject(RSTRING_LEN(v) + VpBaseFig() + 1,
|
281
304
|
RSTRING_PTR(v));
|
282
305
|
#endif /* ENABLE_NUMERIC_STRING */
|
@@ -327,11 +350,13 @@ BigDecimal_double_fig(VALUE self)
|
|
327
350
|
/* call-seq:
|
328
351
|
* big_decimal.precs -> array
|
329
352
|
*
|
330
|
-
* Returns an Array of two Integer values
|
353
|
+
* Returns an Array of two Integer values that represent platform-dependent
|
354
|
+
* internal storage properties.
|
331
355
|
*
|
332
|
-
*
|
333
|
-
*
|
334
|
-
*
|
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.
|
335
360
|
*
|
336
361
|
* BigDecimal('5').precs #=> [9, 18]
|
337
362
|
*/
|
@@ -343,12 +368,109 @@ BigDecimal_prec(VALUE self)
|
|
343
368
|
Real *p;
|
344
369
|
VALUE obj;
|
345
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
|
+
|
346
375
|
GUARD_OBJ(p, GetVpValue(self, 1));
|
347
|
-
obj = rb_assoc_new(
|
348
|
-
|
376
|
+
obj = rb_assoc_new(SIZET2NUM(p->Prec*VpBaseFig()),
|
377
|
+
SIZET2NUM(p->MaxPrec*VpBaseFig()));
|
349
378
|
return obj;
|
350
379
|
}
|
351
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
|
+
|
352
474
|
/*
|
353
475
|
* call-seq: hash
|
354
476
|
*
|
@@ -418,7 +540,6 @@ BigDecimal_load(VALUE self, VALUE str)
|
|
418
540
|
unsigned long m=0;
|
419
541
|
|
420
542
|
pch = (unsigned char *)StringValueCStr(str);
|
421
|
-
rb_check_safe_obj(str);
|
422
543
|
/* First get max prec */
|
423
544
|
while((*pch) != (unsigned char)'\0' && (ch = *pch++) != (unsigned char)':') {
|
424
545
|
if(!ISDIGIT(ch)) {
|
@@ -877,7 +998,7 @@ BigDecimal_coerce(VALUE self, VALUE other)
|
|
877
998
|
Real *b;
|
878
999
|
|
879
1000
|
if (RB_TYPE_P(other, T_FLOAT)) {
|
880
|
-
GUARD_OBJ(b, GetVpValueWithPrec(other,
|
1001
|
+
GUARD_OBJ(b, GetVpValueWithPrec(other, DBLE_FIG, 1));
|
881
1002
|
obj = rb_assoc_new(ToValue(b), self);
|
882
1003
|
}
|
883
1004
|
else {
|
@@ -935,7 +1056,7 @@ BigDecimal_add(VALUE self, VALUE r)
|
|
935
1056
|
|
936
1057
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
937
1058
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
938
|
-
b = GetVpValueWithPrec(r,
|
1059
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
939
1060
|
}
|
940
1061
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
941
1062
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -993,7 +1114,7 @@ BigDecimal_sub(VALUE self, VALUE r)
|
|
993
1114
|
|
994
1115
|
GUARD_OBJ(a, GetVpValue(self,1));
|
995
1116
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
996
|
-
b = GetVpValueWithPrec(r,
|
1117
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
997
1118
|
}
|
998
1119
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
999
1120
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1043,7 +1164,7 @@ BigDecimalCmp(VALUE self, VALUE r,char op)
|
|
1043
1164
|
break;
|
1044
1165
|
|
1045
1166
|
case T_FLOAT:
|
1046
|
-
GUARD_OBJ(b, GetVpValueWithPrec(r,
|
1167
|
+
GUARD_OBJ(b, GetVpValueWithPrec(r, DBLE_FIG, 0));
|
1047
1168
|
break;
|
1048
1169
|
|
1049
1170
|
case T_RATIONAL:
|
@@ -1256,7 +1377,7 @@ BigDecimal_mult(VALUE self, VALUE r)
|
|
1256
1377
|
|
1257
1378
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1258
1379
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1259
|
-
|
1380
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1260
1381
|
}
|
1261
1382
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1262
1383
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1284,7 +1405,7 @@ BigDecimal_divide(Real **c, Real **res, Real **div, VALUE self, VALUE r)
|
|
1284
1405
|
|
1285
1406
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1286
1407
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1287
|
-
|
1408
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1288
1409
|
}
|
1289
1410
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1290
1411
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1350,7 +1471,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
|
|
1350
1471
|
|
1351
1472
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1352
1473
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1353
|
-
b = GetVpValueWithPrec(r,
|
1474
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1354
1475
|
}
|
1355
1476
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1356
1477
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1451,7 +1572,7 @@ BigDecimal_divremain(VALUE self, VALUE r, Real **dv, Real **rv)
|
|
1451
1572
|
|
1452
1573
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1453
1574
|
if (RB_TYPE_P(r, T_FLOAT)) {
|
1454
|
-
b = GetVpValueWithPrec(r,
|
1575
|
+
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
|
1455
1576
|
}
|
1456
1577
|
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
1457
1578
|
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
|
@@ -1756,20 +1877,23 @@ BigDecimal_fix(VALUE self)
|
|
1756
1877
|
* round(n, mode)
|
1757
1878
|
*
|
1758
1879
|
* Round to the nearest integer (by default), returning the result as a
|
1759
|
-
* BigDecimal.
|
1880
|
+
* BigDecimal if n is specified, or as an Integer if it isn't.
|
1760
1881
|
*
|
1761
1882
|
* BigDecimal('3.14159').round #=> 3
|
1762
1883
|
* BigDecimal('8.7').round #=> 9
|
1763
1884
|
* BigDecimal('-9.9').round #=> -10
|
1764
1885
|
*
|
1886
|
+
* BigDecimal('3.14159').round(2).class.name #=> "BigDecimal"
|
1887
|
+
* BigDecimal('3.14159').round.class.name #=> "Integer"
|
1888
|
+
*
|
1765
1889
|
* If n is specified and positive, the fractional part of the result has no
|
1766
1890
|
* more than that many digits.
|
1767
1891
|
*
|
1768
1892
|
* If n is specified and negative, at least that many digits to the left of the
|
1769
|
-
* decimal point will be 0 in the result.
|
1893
|
+
* decimal point will be 0 in the result, and return value will be an Integer.
|
1770
1894
|
*
|
1771
1895
|
* BigDecimal('3.14159').round(3) #=> 3.142
|
1772
|
-
* BigDecimal('13345.234').round(-2) #=> 13300
|
1896
|
+
* BigDecimal('13345.234').round(-2) #=> 13300
|
1773
1897
|
*
|
1774
1898
|
* The value of the optional mode argument can be used to determine how
|
1775
1899
|
* rounding is performed; see BigDecimal.mode.
|
@@ -1782,6 +1906,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1782
1906
|
int iLoc = 0;
|
1783
1907
|
VALUE vLoc;
|
1784
1908
|
VALUE vRound;
|
1909
|
+
int round_to_int = 0;
|
1785
1910
|
size_t mx, pl;
|
1786
1911
|
|
1787
1912
|
unsigned short sw = VpGetRoundMode();
|
@@ -1789,6 +1914,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1789
1914
|
switch (rb_scan_args(argc, argv, "02", &vLoc, &vRound)) {
|
1790
1915
|
case 0:
|
1791
1916
|
iLoc = 0;
|
1917
|
+
round_to_int = 1;
|
1792
1918
|
break;
|
1793
1919
|
case 1:
|
1794
1920
|
if (RB_TYPE_P(vLoc, T_HASH)) {
|
@@ -1796,6 +1922,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1796
1922
|
}
|
1797
1923
|
else {
|
1798
1924
|
iLoc = NUM2INT(vLoc);
|
1925
|
+
if (iLoc < 1) round_to_int = 1;
|
1799
1926
|
}
|
1800
1927
|
break;
|
1801
1928
|
case 2:
|
@@ -1817,7 +1944,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1817
1944
|
GUARD_OBJ(c, VpCreateRbObject(mx, "0"));
|
1818
1945
|
VpSetPrecLimit(pl);
|
1819
1946
|
VpActiveRound(c, a, sw, iLoc);
|
1820
|
-
if (
|
1947
|
+
if (round_to_int) {
|
1821
1948
|
return BigDecimal_to_i(ToValue(c));
|
1822
1949
|
}
|
1823
1950
|
return ToValue(c);
|
@@ -2027,7 +2154,6 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2027
2154
|
if (rb_scan_args(argc, argv, "01", &f) == 1) {
|
2028
2155
|
if (RB_TYPE_P(f, T_STRING)) {
|
2029
2156
|
psz = StringValueCStr(f);
|
2030
|
-
rb_check_safe_obj(f);
|
2031
2157
|
if (*psz == ' ') {
|
2032
2158
|
fPlus = 1;
|
2033
2159
|
psz++;
|
@@ -2067,7 +2193,7 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2067
2193
|
nc += (nc + mc - 1) / mc + 1;
|
2068
2194
|
}
|
2069
2195
|
|
2070
|
-
str =
|
2196
|
+
str = rb_usascii_str_new(0, nc);
|
2071
2197
|
psz = RSTRING_PTR(str);
|
2072
2198
|
|
2073
2199
|
if (fmt) {
|
@@ -2132,7 +2258,7 @@ BigDecimal_split(VALUE self)
|
|
2132
2258
|
rb_ary_push(obj, str);
|
2133
2259
|
rb_str_resize(str, strlen(psz1));
|
2134
2260
|
rb_ary_push(obj, INT2FIX(10));
|
2135
|
-
rb_ary_push(obj,
|
2261
|
+
rb_ary_push(obj, SSIZET2NUM(e));
|
2136
2262
|
return obj;
|
2137
2263
|
}
|
2138
2264
|
|
@@ -2145,7 +2271,7 @@ static VALUE
|
|
2145
2271
|
BigDecimal_exponent(VALUE self)
|
2146
2272
|
{
|
2147
2273
|
ssize_t e = VpExponent10(GetVpValue(self, 1));
|
2148
|
-
return
|
2274
|
+
return SSIZET2NUM(e);
|
2149
2275
|
}
|
2150
2276
|
|
2151
2277
|
/* Returns a string representation of self.
|
@@ -2338,7 +2464,10 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2338
2464
|
}
|
2339
2465
|
goto retry;
|
2340
2466
|
}
|
2341
|
-
|
2467
|
+
if (NIL_P(prec)) {
|
2468
|
+
n += DBLE_FIG;
|
2469
|
+
}
|
2470
|
+
exp = GetVpValueWithPrec(vexp, DBLE_FIG, 1);
|
2342
2471
|
break;
|
2343
2472
|
|
2344
2473
|
case T_RATIONAL:
|
@@ -2353,6 +2482,9 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2353
2482
|
goto retry;
|
2354
2483
|
}
|
2355
2484
|
exp = GetVpValueWithPrec(vexp, n, 1);
|
2485
|
+
if (NIL_P(prec)) {
|
2486
|
+
n += n;
|
2487
|
+
}
|
2356
2488
|
break;
|
2357
2489
|
|
2358
2490
|
case T_DATA:
|
@@ -2363,6 +2495,10 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2363
2495
|
vexp = BigDecimal_to_i(vexp);
|
2364
2496
|
goto retry;
|
2365
2497
|
}
|
2498
|
+
if (NIL_P(prec)) {
|
2499
|
+
GUARD_OBJ(y, GetVpValue(vexp, 1));
|
2500
|
+
n += y->Prec*VpBaseFig();
|
2501
|
+
}
|
2366
2502
|
exp = DATA_PTR(vexp);
|
2367
2503
|
break;
|
2368
2504
|
}
|
@@ -2560,6 +2696,10 @@ BigDecimal_clone(VALUE self)
|
|
2560
2696
|
return self;
|
2561
2697
|
}
|
2562
2698
|
|
2699
|
+
#ifdef HAVE_RB_OPTS_EXCEPTION_P
|
2700
|
+
int rb_opts_exception_p(VALUE opts, int default_value);
|
2701
|
+
#define opts_exception_p(opts) rb_opts_exception_p((opts), 1)
|
2702
|
+
#else
|
2563
2703
|
static int
|
2564
2704
|
opts_exception_p(VALUE opts)
|
2565
2705
|
{
|
@@ -2568,12 +2708,20 @@ opts_exception_p(VALUE opts)
|
|
2568
2708
|
if (!kwds[0]) {
|
2569
2709
|
kwds[0] = rb_intern_const("exception");
|
2570
2710
|
}
|
2571
|
-
rb_get_kwargs(opts, kwds, 0, 1, &exception);
|
2711
|
+
if (!rb_get_kwargs(opts, kwds, 0, 1, &exception)) return 1;
|
2712
|
+
switch (exception) {
|
2713
|
+
case Qtrue: case Qfalse:
|
2714
|
+
break;
|
2715
|
+
default:
|
2716
|
+
rb_raise(rb_eArgError, "true or false is expected as exception: %+"PRIsVALUE,
|
2717
|
+
exception);
|
2718
|
+
}
|
2572
2719
|
return exception != Qfalse;
|
2573
2720
|
}
|
2721
|
+
#endif
|
2574
2722
|
|
2575
2723
|
static Real *
|
2576
|
-
|
2724
|
+
VpNewVarArg(int argc, VALUE *argv)
|
2577
2725
|
{
|
2578
2726
|
size_t mf;
|
2579
2727
|
VALUE opts = Qnil;
|
@@ -2616,6 +2764,7 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2616
2764
|
}
|
2617
2765
|
}
|
2618
2766
|
|
2767
|
+
retry:
|
2619
2768
|
switch (TYPE(iniValue)) {
|
2620
2769
|
case T_DATA:
|
2621
2770
|
if (is_kind_of_BigDecimal(iniValue)) {
|
@@ -2635,7 +2784,7 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2635
2784
|
VpDtoV(pv, d);
|
2636
2785
|
return pv;
|
2637
2786
|
}
|
2638
|
-
if (mf >
|
2787
|
+
if (mf > DBLE_FIG) {
|
2639
2788
|
if (!exc) {
|
2640
2789
|
return NULL;
|
2641
2790
|
}
|
@@ -2653,6 +2802,18 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2653
2802
|
}
|
2654
2803
|
return GetVpValueWithPrec(iniValue, mf, 1);
|
2655
2804
|
|
2805
|
+
case T_COMPLEX:
|
2806
|
+
{
|
2807
|
+
VALUE im;
|
2808
|
+
im = rb_complex_imag(iniValue);
|
2809
|
+
if (!is_zero(im)) {
|
2810
|
+
rb_raise(rb_eArgError,
|
2811
|
+
"Unable to make a BigDecimal from non-zero imaginary number");
|
2812
|
+
}
|
2813
|
+
iniValue = rb_complex_real(iniValue);
|
2814
|
+
goto retry;
|
2815
|
+
}
|
2816
|
+
|
2656
2817
|
case T_STRING:
|
2657
2818
|
/* fall through */
|
2658
2819
|
default:
|
@@ -2667,23 +2828,6 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2667
2828
|
return VpAlloc(mf, RSTRING_PTR(iniValue), 1, exc);
|
2668
2829
|
}
|
2669
2830
|
|
2670
|
-
static VALUE
|
2671
|
-
BigDecimal_new(int argc, VALUE *argv, VALUE klass)
|
2672
|
-
{
|
2673
|
-
ENTER(1);
|
2674
|
-
Real *pv;
|
2675
|
-
VALUE obj;
|
2676
|
-
|
2677
|
-
obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, 0);
|
2678
|
-
pv = VpNewVarArgs(argc, argv);
|
2679
|
-
if (pv == NULL) return Qnil;
|
2680
|
-
SAVE(pv);
|
2681
|
-
if (ToValue(pv)) pv = VpCopy(NULL, pv);
|
2682
|
-
RTYPEDDATA_DATA(obj) = pv;
|
2683
|
-
RB_OBJ_FREEZE(obj);
|
2684
|
-
return pv->obj = obj;
|
2685
|
-
}
|
2686
|
-
|
2687
2831
|
/* call-seq:
|
2688
2832
|
* BigDecimal(initial, digits, exception: true)
|
2689
2833
|
*
|
@@ -2723,28 +2867,35 @@ BigDecimal_new(int argc, VALUE *argv, VALUE klass)
|
|
2723
2867
|
static VALUE
|
2724
2868
|
f_BigDecimal(int argc, VALUE *argv, VALUE self)
|
2725
2869
|
{
|
2726
|
-
|
2870
|
+
ENTER(1);
|
2871
|
+
Real *pv;
|
2872
|
+
VALUE obj;
|
2873
|
+
|
2874
|
+
if (argc > 0 && CLASS_OF(argv[0]) == rb_cBigDecimal) {
|
2875
|
+
if (argc == 1 || (argc == 2 && RB_TYPE_P(argv[1], T_HASH))) return argv[0];
|
2876
|
+
}
|
2877
|
+
obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, 0);
|
2878
|
+
pv = VpNewVarArg(argc, argv);
|
2879
|
+
if (pv == NULL) return Qnil;
|
2880
|
+
SAVE(pv);
|
2881
|
+
if (ToValue(pv)) pv = VpCopy(NULL, pv);
|
2882
|
+
RTYPEDDATA_DATA(obj) = pv;
|
2883
|
+
RB_OBJ_FREEZE(obj);
|
2884
|
+
return pv->obj = obj;
|
2727
2885
|
}
|
2728
2886
|
|
2729
2887
|
static VALUE
|
2730
2888
|
BigDecimal_s_interpret_loosely(VALUE klass, VALUE str)
|
2731
2889
|
{
|
2732
|
-
|
2733
|
-
|
2734
|
-
|
2735
|
-
|
2736
|
-
c_str = StringValueCStr(str);
|
2737
|
-
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
|
2738
|
-
pv->obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, pv);
|
2739
|
-
RB_OBJ_FREEZE(pv->obj);
|
2740
|
-
return pv->obj;
|
2741
|
-
}
|
2890
|
+
ENTER(1);
|
2891
|
+
char const *c_str;
|
2892
|
+
Real *pv;
|
2742
2893
|
|
2743
|
-
|
2744
|
-
|
2745
|
-
|
2746
|
-
|
2747
|
-
return
|
2894
|
+
c_str = StringValueCStr(str);
|
2895
|
+
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
|
2896
|
+
pv->obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, pv);
|
2897
|
+
RB_OBJ_FREEZE(pv->obj);
|
2898
|
+
return pv->obj;
|
2748
2899
|
}
|
2749
2900
|
|
2750
2901
|
/* call-seq:
|
@@ -2763,7 +2914,7 @@ static VALUE
|
|
2763
2914
|
BigDecimal_limit(int argc, VALUE *argv, VALUE self)
|
2764
2915
|
{
|
2765
2916
|
VALUE nFig;
|
2766
|
-
VALUE nCur =
|
2917
|
+
VALUE nCur = SIZET2NUM(VpGetPrecLimit());
|
2767
2918
|
|
2768
2919
|
if (rb_scan_args(argc, argv, "01", &nFig) == 1) {
|
2769
2920
|
int nf;
|
@@ -2928,7 +3079,7 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2928
3079
|
infinite = isinf(flo);
|
2929
3080
|
nan = isnan(flo);
|
2930
3081
|
if (!infinite && !nan) {
|
2931
|
-
vx = GetVpValueWithPrec(x,
|
3082
|
+
vx = GetVpValueWithPrec(x, DBLE_FIG, 0);
|
2932
3083
|
}
|
2933
3084
|
break;
|
2934
3085
|
|
@@ -2966,6 +3117,10 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2966
3117
|
n = prec + rmpd_double_figures();
|
2967
3118
|
negative = BIGDECIMAL_NEGATIVE_P(vx);
|
2968
3119
|
if (negative) {
|
3120
|
+
VALUE x_zero = INT2NUM(1);
|
3121
|
+
VALUE x_copy = f_BigDecimal(1, &x_zero, klass);
|
3122
|
+
x = BigDecimal_initialize_copy(x_copy, x);
|
3123
|
+
vx = DATA_PTR(x);
|
2969
3124
|
VpSetSign(vx, 1);
|
2970
3125
|
}
|
2971
3126
|
|
@@ -3077,7 +3232,7 @@ get_vp_value:
|
|
3077
3232
|
infinite = isinf(flo);
|
3078
3233
|
nan = isnan(flo);
|
3079
3234
|
if (!zero && !negative && !infinite && !nan) {
|
3080
|
-
vx = GetVpValueWithPrec(x,
|
3235
|
+
vx = GetVpValueWithPrec(x, DBLE_FIG, 1);
|
3081
3236
|
}
|
3082
3237
|
break;
|
3083
3238
|
|
@@ -3311,9 +3466,9 @@ Init_bigdecimal(void)
|
|
3311
3466
|
rb_define_global_function("BigDecimal", f_BigDecimal, -1);
|
3312
3467
|
|
3313
3468
|
/* Class methods */
|
3314
|
-
|
3469
|
+
rb_undef_alloc_func(rb_cBigDecimal);
|
3470
|
+
rb_undef_method(CLASS_OF(rb_cBigDecimal), "new");
|
3315
3471
|
rb_define_singleton_method(rb_cBigDecimal, "interpret_loosely", BigDecimal_s_interpret_loosely, 1);
|
3316
|
-
rb_define_singleton_method(rb_cBigDecimal, "new", BigDecimal_s_new, -1);
|
3317
3472
|
rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
|
3318
3473
|
rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1);
|
3319
3474
|
rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0);
|
@@ -3444,8 +3599,9 @@ Init_bigdecimal(void)
|
|
3444
3599
|
|
3445
3600
|
|
3446
3601
|
/* instance methods */
|
3447
|
-
rb_define_method(rb_cBigDecimal, "initialize_copy", BigDecimal_initialize_copy, 1);
|
3448
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);
|
3449
3605
|
|
3450
3606
|
rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
|
3451
3607
|
rb_define_method(rb_cBigDecimal, "sub", BigDecimal_sub2, 2);
|
@@ -3968,7 +4124,7 @@ VpNumOfChars(Real *vp,const char *pszFmt)
|
|
3968
4124
|
* by one BDIGIT word in the computer used.
|
3969
4125
|
*
|
3970
4126
|
* [Returns]
|
3971
|
-
*
|
4127
|
+
* DBLE_FIG ... OK
|
3972
4128
|
*/
|
3973
4129
|
VP_EXPORT size_t
|
3974
4130
|
VpInit(BDIGIT BaseVal)
|
@@ -4138,7 +4294,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4138
4294
|
/* at least mx digits. */
|
4139
4295
|
/* szVal==NULL ==> allocate zero value. */
|
4140
4296
|
vp = VpAllocReal(mx);
|
4141
|
-
/* xmalloc()
|
4297
|
+
/* xmalloc() always returns(or throw interruption) */
|
4142
4298
|
vp->MaxPrec = mx; /* set max precision */
|
4143
4299
|
VpSetZero(vp, 1); /* initialize vp to zero. */
|
4144
4300
|
return vp;
|
@@ -4314,7 +4470,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4314
4470
|
nalloc = Max(nalloc, mx);
|
4315
4471
|
mx = nalloc;
|
4316
4472
|
vp = VpAllocReal(mx);
|
4317
|
-
/* xmalloc()
|
4473
|
+
/* xmalloc() always returns(or throw interruption) */
|
4318
4474
|
vp->MaxPrec = mx; /* set max precision */
|
4319
4475
|
VpSetZero(vp, sign);
|
4320
4476
|
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
@@ -36,8 +36,14 @@ have_func("isfinite", "math.h")
|
|
36
36
|
have_type("struct RRational", "ruby.h")
|
37
37
|
have_func("rb_rational_num", "ruby.h")
|
38
38
|
have_func("rb_rational_den", "ruby.h")
|
39
|
+
have_type("struct RComplex", "ruby.h")
|
40
|
+
have_func("rb_complex_real", "ruby.h")
|
41
|
+
have_func("rb_complex_imag", "ruby.h")
|
39
42
|
have_func("rb_array_const_ptr", "ruby.h")
|
40
43
|
have_func("rb_sym2str", "ruby.h")
|
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")
|
41
47
|
|
42
48
|
if File.file?(File.expand_path('../lib/bigdecimal.rb', __FILE__))
|
43
49
|
bigdecimal_rb = "$(srcdir)/lib/bigdecimal.rb"
|
data/lib/bigdecimal/jacobian.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
|
-
|
2
|
+
|
3
|
+
require 'bigdecimal'
|
4
|
+
|
3
5
|
# require 'bigdecimal/jacobian'
|
4
6
|
#
|
5
7
|
# Provides methods to compute the Jacobian matrix of a set of equations at a
|
@@ -21,9 +23,6 @@
|
|
21
23
|
#
|
22
24
|
# fx is f.values(x).
|
23
25
|
#
|
24
|
-
|
25
|
-
require 'bigdecimal'
|
26
|
-
|
27
26
|
module Jacobian
|
28
27
|
module_function
|
29
28
|
|
data/lib/bigdecimal/util.rb
CHANGED
@@ -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
|
@@ -131,6 +131,39 @@ class Rational < Numeric
|
|
131
131
|
end
|
132
132
|
|
133
133
|
|
134
|
+
class Complex < Numeric
|
135
|
+
# call-seq:
|
136
|
+
# cmp.to_d -> bigdecimal
|
137
|
+
# cmp.to_d(precision) -> bigdecimal
|
138
|
+
#
|
139
|
+
# Returns the value as a BigDecimal.
|
140
|
+
#
|
141
|
+
# The +precision+ parameter is required for a rational complex number.
|
142
|
+
# This parameter is used to determine the number of significant digits
|
143
|
+
# for the result.
|
144
|
+
#
|
145
|
+
# require 'bigdecimal'
|
146
|
+
# require 'bigdecimal/util'
|
147
|
+
#
|
148
|
+
# Complex(0.1234567, 0).to_d(4) # => 0.1235e0
|
149
|
+
# Complex(Rational(22, 7), 0).to_d(3) # => 0.314e1
|
150
|
+
#
|
151
|
+
# See also BigDecimal::new.
|
152
|
+
#
|
153
|
+
def to_d(*args)
|
154
|
+
BigDecimal(self) unless self.imag.zero? # to raise eerror
|
155
|
+
|
156
|
+
if args.length == 0
|
157
|
+
case self.real
|
158
|
+
when Rational
|
159
|
+
BigDecimal(self.real) # to raise error
|
160
|
+
end
|
161
|
+
end
|
162
|
+
self.real.to_d(*args)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
|
134
167
|
class NilClass
|
135
168
|
# call-seq:
|
136
169
|
# nil.to_d -> bigdecimal
|
data/lib/bigdecimal.rb
CHANGED
@@ -1,22 +1 @@
|
|
1
|
-
|
2
|
-
require "#{RUBY_VERSION[/\d+\.\d+/]}/bigdecimal.so"
|
3
|
-
rescue LoadError
|
4
|
-
require 'bigdecimal.so'
|
5
|
-
end
|
6
|
-
|
7
|
-
class BigDecimal
|
8
|
-
module Deprecation
|
9
|
-
def new(*args, **kwargs)
|
10
|
-
warn "BigDecimal.new is deprecated; use BigDecimal() method instead.", uplevel: 1
|
11
|
-
super
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class << self
|
16
|
-
prepend Deprecation
|
17
|
-
|
18
|
-
def inherited(subclass)
|
19
|
-
warn "subclassing BigDecimal will be disallowed after bigdecimal version 2.0", uplevel: 1
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require 'bigdecimal.so'
|
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: 2.0.3
|
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: 2020-12-19 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
|
@@ -40,20 +40,6 @@ dependencies:
|
|
40
40
|
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '0.9'
|
43
|
-
- !ruby/object:Gem::Dependency
|
44
|
-
name: rake-compiler-dock
|
45
|
-
requirement: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - ">="
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: 0.6.1
|
50
|
-
type: :development
|
51
|
-
prerelease: false
|
52
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 0.6.1
|
57
43
|
- !ruby/object:Gem::Dependency
|
58
44
|
name: minitest
|
59
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,7 +92,7 @@ files:
|
|
106
92
|
- sample/pi.rb
|
107
93
|
homepage: https://github.com/ruby/bigdecimal
|
108
94
|
licenses:
|
109
|
-
-
|
95
|
+
- Ruby
|
110
96
|
metadata: {}
|
111
97
|
post_install_message:
|
112
98
|
rdoc_options: []
|
@@ -116,14 +102,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
102
|
requirements:
|
117
103
|
- - ">="
|
118
104
|
- !ruby/object:Gem::Version
|
119
|
-
version: 2.
|
105
|
+
version: 2.4.0
|
120
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
108
|
- - ">="
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0'
|
125
111
|
requirements: []
|
126
|
-
rubygems_version: 3.
|
112
|
+
rubygems_version: 3.2.2
|
127
113
|
signing_key:
|
128
114
|
specification_version: 4
|
129
115
|
summary: Arbitrary-precision decimal floating-point number library.
|