bigdecimal 1.4.2 → 2.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 +5 -11
- data/ext/bigdecimal/bigdecimal.c +105 -36
- data/ext/bigdecimal/extconf.rb +20 -5
- data/lib/bigdecimal.rb +1 -10
- data/lib/bigdecimal/jacobian.rb +3 -4
- data/lib/bigdecimal/util.rb +36 -1
- metadata +9 -28
- data/ext/bigdecimal/bigdecimal.def +0 -3
- data/ext/bigdecimal/depend +0 -16
- data/ext/bigdecimal/util/extconf.rb +0 -24
- data/ext/bigdecimal/util/util.c +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f755d262f35a249de6848a00e3bf3b8d7a4816dc9a61bb81c099a22baa40bf66
|
4
|
+
data.tar.gz: f3b06716476c5da9c8a8006b6aeca492ac0206bce305c23910280fe0a0b28de1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35be1b5d13ee12b4b40ab3cf7277fb235fffcaf554f71107fe3b0727bcef9edb6b03c02bd7db0039505a575752a8014f41402775e8080ec9da2dcda184787df5
|
7
|
+
data.tar.gz: f4f063cc6cd0291cbac0f77b2fac485a1e064b08a8789e2ac7b796e6e36529a40a781783bc0417893e01985ad5fa37487c233e5da8fb88eb64c73774de2a9173
|
data/bigdecimal.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
bigdecimal_version = '
|
3
|
+
bigdecimal_version = '2.0.2'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "bigdecimal"
|
@@ -11,19 +11,14 @@ 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
|
-
s.extensions = %w[ext/bigdecimal/extconf.rb
|
17
|
+
s.extensions = %w[ext/bigdecimal/extconf.rb]
|
18
18
|
s.files = %w[
|
19
19
|
bigdecimal.gemspec
|
20
20
|
ext/bigdecimal/bigdecimal.c
|
21
|
-
ext/bigdecimal/bigdecimal.def
|
22
21
|
ext/bigdecimal/bigdecimal.h
|
23
|
-
ext/bigdecimal/depend
|
24
|
-
ext/bigdecimal/extconf.rb
|
25
|
-
ext/bigdecimal/util/extconf.rb
|
26
|
-
ext/bigdecimal/util/util.c
|
27
22
|
lib/bigdecimal.rb
|
28
23
|
lib/bigdecimal/jacobian.rb
|
29
24
|
lib/bigdecimal/ludcmp.rb
|
@@ -35,11 +30,10 @@ Gem::Specification.new do |s|
|
|
35
30
|
sample/pi.rb
|
36
31
|
]
|
37
32
|
|
38
|
-
s.required_ruby_version = Gem::Requirement.new(">= 2.
|
33
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
39
34
|
|
40
|
-
s.add_development_dependency "rake", "
|
35
|
+
s.add_development_dependency "rake", ">= 12.3.3"
|
41
36
|
s.add_development_dependency "rake-compiler", ">= 0.9"
|
42
|
-
s.add_development_dependency "rake-compiler-dock", ">= 0.6.1"
|
43
37
|
s.add_development_dependency "minitest", "< 5.0.0"
|
44
38
|
s.add_development_dependency "pry"
|
45
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>
|
@@ -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
|
|
@@ -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 */
|
@@ -344,8 +367,8 @@ BigDecimal_prec(VALUE self)
|
|
344
367
|
VALUE obj;
|
345
368
|
|
346
369
|
GUARD_OBJ(p, GetVpValue(self, 1));
|
347
|
-
obj = rb_assoc_new(
|
348
|
-
|
370
|
+
obj = rb_assoc_new(SIZET2NUM(p->Prec*VpBaseFig()),
|
371
|
+
SIZET2NUM(p->MaxPrec*VpBaseFig()));
|
349
372
|
return obj;
|
350
373
|
}
|
351
374
|
|
@@ -418,7 +441,6 @@ BigDecimal_load(VALUE self, VALUE str)
|
|
418
441
|
unsigned long m=0;
|
419
442
|
|
420
443
|
pch = (unsigned char *)StringValueCStr(str);
|
421
|
-
rb_check_safe_obj(str);
|
422
444
|
/* First get max prec */
|
423
445
|
while((*pch) != (unsigned char)'\0' && (ch = *pch++) != (unsigned char)':') {
|
424
446
|
if(!ISDIGIT(ch)) {
|
@@ -1756,20 +1778,23 @@ BigDecimal_fix(VALUE self)
|
|
1756
1778
|
* round(n, mode)
|
1757
1779
|
*
|
1758
1780
|
* Round to the nearest integer (by default), returning the result as a
|
1759
|
-
* BigDecimal.
|
1781
|
+
* BigDecimal if n is specified, or as an Integer if it isn't.
|
1760
1782
|
*
|
1761
1783
|
* BigDecimal('3.14159').round #=> 3
|
1762
1784
|
* BigDecimal('8.7').round #=> 9
|
1763
1785
|
* BigDecimal('-9.9').round #=> -10
|
1764
1786
|
*
|
1787
|
+
* BigDecimal('3.14159').round(2).class.name #=> "BigDecimal"
|
1788
|
+
* BigDecimal('3.14159').round.class.name #=> "Integer"
|
1789
|
+
*
|
1765
1790
|
* If n is specified and positive, the fractional part of the result has no
|
1766
1791
|
* more than that many digits.
|
1767
1792
|
*
|
1768
1793
|
* 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.
|
1794
|
+
* decimal point will be 0 in the result, and return value will be an Integer.
|
1770
1795
|
*
|
1771
1796
|
* BigDecimal('3.14159').round(3) #=> 3.142
|
1772
|
-
* BigDecimal('13345.234').round(-2) #=> 13300
|
1797
|
+
* BigDecimal('13345.234').round(-2) #=> 13300
|
1773
1798
|
*
|
1774
1799
|
* The value of the optional mode argument can be used to determine how
|
1775
1800
|
* rounding is performed; see BigDecimal.mode.
|
@@ -1782,6 +1807,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1782
1807
|
int iLoc = 0;
|
1783
1808
|
VALUE vLoc;
|
1784
1809
|
VALUE vRound;
|
1810
|
+
int round_to_int = 0;
|
1785
1811
|
size_t mx, pl;
|
1786
1812
|
|
1787
1813
|
unsigned short sw = VpGetRoundMode();
|
@@ -1789,6 +1815,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1789
1815
|
switch (rb_scan_args(argc, argv, "02", &vLoc, &vRound)) {
|
1790
1816
|
case 0:
|
1791
1817
|
iLoc = 0;
|
1818
|
+
round_to_int = 1;
|
1792
1819
|
break;
|
1793
1820
|
case 1:
|
1794
1821
|
if (RB_TYPE_P(vLoc, T_HASH)) {
|
@@ -1796,6 +1823,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1796
1823
|
}
|
1797
1824
|
else {
|
1798
1825
|
iLoc = NUM2INT(vLoc);
|
1826
|
+
if (iLoc < 1) round_to_int = 1;
|
1799
1827
|
}
|
1800
1828
|
break;
|
1801
1829
|
case 2:
|
@@ -1817,7 +1845,7 @@ BigDecimal_round(int argc, VALUE *argv, VALUE self)
|
|
1817
1845
|
GUARD_OBJ(c, VpCreateRbObject(mx, "0"));
|
1818
1846
|
VpSetPrecLimit(pl);
|
1819
1847
|
VpActiveRound(c, a, sw, iLoc);
|
1820
|
-
if (
|
1848
|
+
if (round_to_int) {
|
1821
1849
|
return BigDecimal_to_i(ToValue(c));
|
1822
1850
|
}
|
1823
1851
|
return ToValue(c);
|
@@ -2027,7 +2055,6 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2027
2055
|
if (rb_scan_args(argc, argv, "01", &f) == 1) {
|
2028
2056
|
if (RB_TYPE_P(f, T_STRING)) {
|
2029
2057
|
psz = StringValueCStr(f);
|
2030
|
-
rb_check_safe_obj(f);
|
2031
2058
|
if (*psz == ' ') {
|
2032
2059
|
fPlus = 1;
|
2033
2060
|
psz++;
|
@@ -2067,7 +2094,7 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2067
2094
|
nc += (nc + mc - 1) / mc + 1;
|
2068
2095
|
}
|
2069
2096
|
|
2070
|
-
str =
|
2097
|
+
str = rb_usascii_str_new(0, nc);
|
2071
2098
|
psz = RSTRING_PTR(str);
|
2072
2099
|
|
2073
2100
|
if (fmt) {
|
@@ -2132,7 +2159,7 @@ BigDecimal_split(VALUE self)
|
|
2132
2159
|
rb_ary_push(obj, str);
|
2133
2160
|
rb_str_resize(str, strlen(psz1));
|
2134
2161
|
rb_ary_push(obj, INT2FIX(10));
|
2135
|
-
rb_ary_push(obj,
|
2162
|
+
rb_ary_push(obj, SSIZET2NUM(e));
|
2136
2163
|
return obj;
|
2137
2164
|
}
|
2138
2165
|
|
@@ -2145,7 +2172,7 @@ static VALUE
|
|
2145
2172
|
BigDecimal_exponent(VALUE self)
|
2146
2173
|
{
|
2147
2174
|
ssize_t e = VpExponent10(GetVpValue(self, 1));
|
2148
|
-
return
|
2175
|
+
return SSIZET2NUM(e);
|
2149
2176
|
}
|
2150
2177
|
|
2151
2178
|
/* Returns a string representation of self.
|
@@ -2338,7 +2365,10 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2338
2365
|
}
|
2339
2366
|
goto retry;
|
2340
2367
|
}
|
2341
|
-
|
2368
|
+
if (NIL_P(prec)) {
|
2369
|
+
n += DBLE_FIG;
|
2370
|
+
}
|
2371
|
+
exp = GetVpValueWithPrec(vexp, DBLE_FIG, 1);
|
2342
2372
|
break;
|
2343
2373
|
|
2344
2374
|
case T_RATIONAL:
|
@@ -2353,6 +2383,9 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2353
2383
|
goto retry;
|
2354
2384
|
}
|
2355
2385
|
exp = GetVpValueWithPrec(vexp, n, 1);
|
2386
|
+
if (NIL_P(prec)) {
|
2387
|
+
n += n;
|
2388
|
+
}
|
2356
2389
|
break;
|
2357
2390
|
|
2358
2391
|
case T_DATA:
|
@@ -2363,6 +2396,10 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
|
|
2363
2396
|
vexp = BigDecimal_to_i(vexp);
|
2364
2397
|
goto retry;
|
2365
2398
|
}
|
2399
|
+
if (NIL_P(prec)) {
|
2400
|
+
GUARD_OBJ(y, GetVpValue(vexp, 1));
|
2401
|
+
n += y->Prec*VpBaseFig();
|
2402
|
+
}
|
2366
2403
|
exp = DATA_PTR(vexp);
|
2367
2404
|
break;
|
2368
2405
|
}
|
@@ -2560,6 +2597,10 @@ BigDecimal_clone(VALUE self)
|
|
2560
2597
|
return self;
|
2561
2598
|
}
|
2562
2599
|
|
2600
|
+
#ifdef HAVE_RB_OPTS_EXCEPTION_P
|
2601
|
+
int rb_opts_exception_p(VALUE opts, int default_value);
|
2602
|
+
#define opts_exception_p(opts) rb_opts_exception_p((opts), 1)
|
2603
|
+
#else
|
2563
2604
|
static int
|
2564
2605
|
opts_exception_p(VALUE opts)
|
2565
2606
|
{
|
@@ -2568,12 +2609,20 @@ opts_exception_p(VALUE opts)
|
|
2568
2609
|
if (!kwds[0]) {
|
2569
2610
|
kwds[0] = rb_intern_const("exception");
|
2570
2611
|
}
|
2571
|
-
rb_get_kwargs(opts, kwds, 0, 1, &exception);
|
2612
|
+
if (!rb_get_kwargs(opts, kwds, 0, 1, &exception)) return 1;
|
2613
|
+
switch (exception) {
|
2614
|
+
case Qtrue: case Qfalse:
|
2615
|
+
break;
|
2616
|
+
default:
|
2617
|
+
rb_raise(rb_eArgError, "true or false is expected as exception: %+"PRIsVALUE,
|
2618
|
+
exception);
|
2619
|
+
}
|
2572
2620
|
return exception != Qfalse;
|
2573
2621
|
}
|
2622
|
+
#endif
|
2574
2623
|
|
2575
2624
|
static Real *
|
2576
|
-
|
2625
|
+
VpNewVarArg(int argc, VALUE *argv)
|
2577
2626
|
{
|
2578
2627
|
size_t mf;
|
2579
2628
|
VALUE opts = Qnil;
|
@@ -2616,6 +2665,7 @@ BigDecimal_new(int argc, VALUE *argv)
|
|
2616
2665
|
}
|
2617
2666
|
}
|
2618
2667
|
|
2668
|
+
retry:
|
2619
2669
|
switch (TYPE(iniValue)) {
|
2620
2670
|
case T_DATA:
|
2621
2671
|
if (is_kind_of_BigDecimal(iniValue)) {
|
@@ -2653,6 +2703,18 @@ BigDecimal_new(int argc, VALUE *argv)
|
|
2653
2703
|
}
|
2654
2704
|
return GetVpValueWithPrec(iniValue, mf, 1);
|
2655
2705
|
|
2706
|
+
case T_COMPLEX:
|
2707
|
+
{
|
2708
|
+
VALUE im;
|
2709
|
+
im = rb_complex_imag(iniValue);
|
2710
|
+
if (!is_zero(im)) {
|
2711
|
+
rb_raise(rb_eArgError,
|
2712
|
+
"Unable to make a BigDecimal from non-zero imaginary number");
|
2713
|
+
}
|
2714
|
+
iniValue = rb_complex_real(iniValue);
|
2715
|
+
goto retry;
|
2716
|
+
}
|
2717
|
+
|
2656
2718
|
case T_STRING:
|
2657
2719
|
/* fall through */
|
2658
2720
|
default:
|
@@ -2710,8 +2772,11 @@ f_BigDecimal(int argc, VALUE *argv, VALUE self)
|
|
2710
2772
|
Real *pv;
|
2711
2773
|
VALUE obj;
|
2712
2774
|
|
2775
|
+
if (argc > 0 && CLASS_OF(argv[0]) == rb_cBigDecimal) {
|
2776
|
+
if (argc == 1 || (argc == 2 && RB_TYPE_P(argv[1], T_HASH))) return argv[0];
|
2777
|
+
}
|
2713
2778
|
obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, 0);
|
2714
|
-
pv =
|
2779
|
+
pv = VpNewVarArg(argc, argv);
|
2715
2780
|
if (pv == NULL) return Qnil;
|
2716
2781
|
SAVE(pv);
|
2717
2782
|
if (ToValue(pv)) pv = VpCopy(NULL, pv);
|
@@ -2720,6 +2785,20 @@ f_BigDecimal(int argc, VALUE *argv, VALUE self)
|
|
2720
2785
|
return pv->obj = obj;
|
2721
2786
|
}
|
2722
2787
|
|
2788
|
+
static VALUE
|
2789
|
+
BigDecimal_s_interpret_loosely(VALUE klass, VALUE str)
|
2790
|
+
{
|
2791
|
+
ENTER(1);
|
2792
|
+
char const *c_str;
|
2793
|
+
Real *pv;
|
2794
|
+
|
2795
|
+
c_str = StringValueCStr(str);
|
2796
|
+
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
|
2797
|
+
pv->obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, pv);
|
2798
|
+
RB_OBJ_FREEZE(pv->obj);
|
2799
|
+
return pv->obj;
|
2800
|
+
}
|
2801
|
+
|
2723
2802
|
/* call-seq:
|
2724
2803
|
* BigDecimal.limit(digits)
|
2725
2804
|
*
|
@@ -2736,7 +2815,7 @@ static VALUE
|
|
2736
2815
|
BigDecimal_limit(int argc, VALUE *argv, VALUE self)
|
2737
2816
|
{
|
2738
2817
|
VALUE nFig;
|
2739
|
-
VALUE nCur =
|
2818
|
+
VALUE nCur = SIZET2NUM(VpGetPrecLimit());
|
2740
2819
|
|
2741
2820
|
if (rb_scan_args(argc, argv, "01", &nFig) == 1) {
|
2742
2821
|
int nf;
|
@@ -2939,6 +3018,10 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2939
3018
|
n = prec + rmpd_double_figures();
|
2940
3019
|
negative = BIGDECIMAL_NEGATIVE_P(vx);
|
2941
3020
|
if (negative) {
|
3021
|
+
VALUE x_zero = INT2NUM(1);
|
3022
|
+
VALUE x_copy = f_BigDecimal(1, &x_zero, klass);
|
3023
|
+
x = BigDecimal_initialize_copy(x_copy, x);
|
3024
|
+
vx = DATA_PTR(x);
|
2942
3025
|
VpSetSign(vx, 1);
|
2943
3026
|
}
|
2944
3027
|
|
@@ -3140,20 +3223,6 @@ get_vp_value:
|
|
3140
3223
|
return y;
|
3141
3224
|
}
|
3142
3225
|
|
3143
|
-
VALUE
|
3144
|
-
rmpd_util_str_to_d(VALUE str)
|
3145
|
-
{
|
3146
|
-
ENTER(1);
|
3147
|
-
char const *c_str;
|
3148
|
-
Real *pv;
|
3149
|
-
|
3150
|
-
c_str = StringValueCStr(str);
|
3151
|
-
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
|
3152
|
-
pv->obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, pv);
|
3153
|
-
RB_OBJ_FREEZE(pv->obj);
|
3154
|
-
return pv->obj;
|
3155
|
-
}
|
3156
|
-
|
3157
3226
|
/* Document-class: BigDecimal
|
3158
3227
|
* BigDecimal provides arbitrary-precision floating point decimal arithmetic.
|
3159
3228
|
*
|
@@ -3300,6 +3369,7 @@ Init_bigdecimal(void)
|
|
3300
3369
|
/* Class methods */
|
3301
3370
|
rb_undef_method(CLASS_OF(rb_cBigDecimal), "allocate");
|
3302
3371
|
rb_undef_method(CLASS_OF(rb_cBigDecimal), "new");
|
3372
|
+
rb_define_singleton_method(rb_cBigDecimal, "interpret_loosely", BigDecimal_s_interpret_loosely, 1);
|
3303
3373
|
rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
|
3304
3374
|
rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1);
|
3305
3375
|
rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0);
|
@@ -3430,7 +3500,6 @@ Init_bigdecimal(void)
|
|
3430
3500
|
|
3431
3501
|
|
3432
3502
|
/* instance methods */
|
3433
|
-
rb_define_method(rb_cBigDecimal, "initialize_copy", BigDecimal_initialize_copy, 1);
|
3434
3503
|
rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
|
3435
3504
|
|
3436
3505
|
rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
|
@@ -4124,7 +4193,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4124
4193
|
/* at least mx digits. */
|
4125
4194
|
/* szVal==NULL ==> allocate zero value. */
|
4126
4195
|
vp = VpAllocReal(mx);
|
4127
|
-
/* xmalloc()
|
4196
|
+
/* xmalloc() always returns(or throw interruption) */
|
4128
4197
|
vp->MaxPrec = mx; /* set max precision */
|
4129
4198
|
VpSetZero(vp, 1); /* initialize vp to zero. */
|
4130
4199
|
return vp;
|
@@ -4281,7 +4350,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4281
4350
|
|
4282
4351
|
psz[i] = '\0';
|
4283
4352
|
|
4284
|
-
if (((ni == 0 || dot_seen) && nf == 0) || (exp_seen && ne == 0)) {
|
4353
|
+
if (strict_p && (((ni == 0 || dot_seen) && nf == 0) || (exp_seen && ne == 0))) {
|
4285
4354
|
VALUE str;
|
4286
4355
|
invalid_value:
|
4287
4356
|
if (!strict_p) {
|
@@ -4300,7 +4369,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
|
4300
4369
|
nalloc = Max(nalloc, mx);
|
4301
4370
|
mx = nalloc;
|
4302
4371
|
vp = VpAllocReal(mx);
|
4303
|
-
/* xmalloc()
|
4372
|
+
/* xmalloc() always returns(or throw interruption) */
|
4304
4373
|
vp->MaxPrec = mx; /* set max precision */
|
4305
4374
|
VpSetZero(vp, sign);
|
4306
4375
|
VpCtoV(vp, psz, ni, psz + ipf, nf, psz + ipe, ne);
|
data/ext/bigdecimal/extconf.rb
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
2
|
require 'mkmf'
|
3
3
|
|
4
|
+
def check_bigdecimal_version(gemspec_path)
|
5
|
+
message "checking RUBY_BIGDECIMAL_VERSION... "
|
6
|
+
|
7
|
+
bigdecimal_version =
|
8
|
+
IO.readlines(gemspec_path)
|
9
|
+
.grep(/\Abigdecimal_version\s+=\s+/)[0][/\'([^\']+)\'/, 1]
|
10
|
+
|
11
|
+
version_components = bigdecimal_version.split('.')
|
12
|
+
bigdecimal_version = version_components[0, 3].join('.')
|
13
|
+
bigdecimal_version << "-#{version_components[3]}" if version_components[3]
|
14
|
+
$defs << %Q[-DRUBY_BIGDECIMAL_VERSION=\\"#{bigdecimal_version}\\"]
|
15
|
+
|
16
|
+
message "#{bigdecimal_version}\n"
|
17
|
+
end
|
18
|
+
|
4
19
|
gemspec_name = gemspec_path = nil
|
5
20
|
unless ['', '../../'].any? {|dir|
|
6
21
|
gemspec_name = "#{dir}bigdecimal.gemspec"
|
@@ -11,11 +26,7 @@ unless ['', '../../'].any? {|dir|
|
|
11
26
|
abort
|
12
27
|
end
|
13
28
|
|
14
|
-
|
15
|
-
IO.readlines(gemspec_path)
|
16
|
-
.grep(/\Abigdecimal_version\s+=\s+/)[0][/\'([\d\.]+)\'/, 1]
|
17
|
-
|
18
|
-
$defs << %Q[-DRUBY_BIGDECIMAL_VERSION=\\"#{bigdecimal_version}\\"]
|
29
|
+
check_bigdecimal_version(gemspec_path)
|
19
30
|
|
20
31
|
have_func("labs", "stdlib.h")
|
21
32
|
have_func("llabs", "stdlib.h")
|
@@ -25,8 +36,12 @@ have_func("isfinite", "math.h")
|
|
25
36
|
have_type("struct RRational", "ruby.h")
|
26
37
|
have_func("rb_rational_num", "ruby.h")
|
27
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")
|
28
42
|
have_func("rb_array_const_ptr", "ruby.h")
|
29
43
|
have_func("rb_sym2str", "ruby.h")
|
44
|
+
have_func("rb_opts_exception_p", "ruby.h")
|
30
45
|
|
31
46
|
if File.file?(File.expand_path('../lib/bigdecimal.rb', __FILE__))
|
32
47
|
bigdecimal_rb = "$(srcdir)/lib/bigdecimal.rb"
|
data/lib/bigdecimal.rb
CHANGED
@@ -1,10 +1 @@
|
|
1
|
-
|
2
|
-
require "#{RUBY_VERSION[/\d+\.\d+/]}/bigdecimal.so"
|
3
|
-
rescue LoadError
|
4
|
-
require 'bigdecimal.so'
|
5
|
-
end
|
6
|
-
|
7
|
-
def BigDecimal.new(*args, **kwargs)
|
8
|
-
warn "BigDecimal.new is deprecated; use BigDecimal() method instead.", uplevel: 1
|
9
|
-
BigDecimal(*args, **kwargs)
|
10
|
-
end
|
1
|
+
require 'bigdecimal.so'
|
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
@@ -6,7 +6,6 @@
|
|
6
6
|
#++
|
7
7
|
|
8
8
|
require 'bigdecimal'
|
9
|
-
require 'bigdecimal/util.so'
|
10
9
|
|
11
10
|
class Integer < Numeric
|
12
11
|
# call-seq:
|
@@ -66,6 +65,9 @@ class String
|
|
66
65
|
#
|
67
66
|
# See also BigDecimal::new.
|
68
67
|
#
|
68
|
+
def to_d
|
69
|
+
BigDecimal.interpret_loosely(self)
|
70
|
+
end
|
69
71
|
end
|
70
72
|
|
71
73
|
|
@@ -129,6 +131,39 @@ class Rational < Numeric
|
|
129
131
|
end
|
130
132
|
|
131
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
|
+
|
132
167
|
class NilClass
|
133
168
|
# call-seq:
|
134
169
|
# nil.to_d -> bigdecimal
|
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.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: 2020-12-15 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
|
@@ -89,17 +75,12 @@ email:
|
|
89
75
|
executables: []
|
90
76
|
extensions:
|
91
77
|
- ext/bigdecimal/extconf.rb
|
92
|
-
- ext/bigdecimal/util/extconf.rb
|
93
78
|
extra_rdoc_files: []
|
94
79
|
files:
|
95
80
|
- bigdecimal.gemspec
|
96
81
|
- ext/bigdecimal/bigdecimal.c
|
97
|
-
- ext/bigdecimal/bigdecimal.def
|
98
82
|
- ext/bigdecimal/bigdecimal.h
|
99
|
-
- ext/bigdecimal/depend
|
100
83
|
- ext/bigdecimal/extconf.rb
|
101
|
-
- ext/bigdecimal/util/extconf.rb
|
102
|
-
- ext/bigdecimal/util/util.c
|
103
84
|
- lib/bigdecimal.rb
|
104
85
|
- lib/bigdecimal/jacobian.rb
|
105
86
|
- lib/bigdecimal/ludcmp.rb
|
@@ -111,7 +92,7 @@ files:
|
|
111
92
|
- sample/pi.rb
|
112
93
|
homepage: https://github.com/ruby/bigdecimal
|
113
94
|
licenses:
|
114
|
-
-
|
95
|
+
- Ruby
|
115
96
|
metadata: {}
|
116
97
|
post_install_message:
|
117
98
|
rdoc_options: []
|
@@ -121,14 +102,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
102
|
requirements:
|
122
103
|
- - ">="
|
123
104
|
- !ruby/object:Gem::Version
|
124
|
-
version: 2.
|
105
|
+
version: 2.4.0
|
125
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
107
|
requirements:
|
127
108
|
- - ">="
|
128
109
|
- !ruby/object:Gem::Version
|
129
110
|
version: '0'
|
130
111
|
requirements: []
|
131
|
-
rubygems_version: 3.
|
112
|
+
rubygems_version: 3.1.4
|
132
113
|
signing_key:
|
133
114
|
specification_version: 4
|
134
115
|
summary: Arbitrary-precision decimal floating-point number library.
|
data/ext/bigdecimal/depend
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
extconf.h: $(srcdir)/$(GEMSPEC)
|
2
|
-
Makefile: $(BIGDECIMAL_RB)
|
3
|
-
|
4
|
-
# AUTOGENERATED DEPENDENCIES START
|
5
|
-
bigdecimal.o: $(RUBY_EXTCONF_H)
|
6
|
-
bigdecimal.o: $(arch_hdrdir)/ruby/config.h
|
7
|
-
bigdecimal.o: $(hdrdir)/ruby/defines.h
|
8
|
-
bigdecimal.o: $(hdrdir)/ruby/intern.h
|
9
|
-
bigdecimal.o: $(hdrdir)/ruby/missing.h
|
10
|
-
bigdecimal.o: $(hdrdir)/ruby/ruby.h
|
11
|
-
bigdecimal.o: $(hdrdir)/ruby/st.h
|
12
|
-
bigdecimal.o: $(hdrdir)/ruby/subst.h
|
13
|
-
bigdecimal.o: $(hdrdir)/ruby/util.h
|
14
|
-
bigdecimal.o: bigdecimal.c
|
15
|
-
bigdecimal.o: bigdecimal.h
|
16
|
-
# AUTOGENERATED DEPENDENCIES END
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: false
|
2
|
-
require 'mkmf'
|
3
|
-
|
4
|
-
checking_for(checking_message("Windows")) do
|
5
|
-
case RUBY_PLATFORM
|
6
|
-
when /cygwin|mingw/
|
7
|
-
if ARGV.include?('-rdevkit') # check `rake -rdevkit compile` case
|
8
|
-
base_dir = File.expand_path('../../../..', __FILE__)
|
9
|
-
build_dir = File.join(base_dir, "tmp", RUBY_PLATFORM, "bigdecimal", RUBY_VERSION, "")
|
10
|
-
else
|
11
|
-
build_dir = "$(TARGET_SO_DIR)../"
|
12
|
-
end
|
13
|
-
$libs << " #{build_dir}bigdecimal.so"
|
14
|
-
true
|
15
|
-
when /mswin/
|
16
|
-
$DLDFLAGS << " -libpath:.."
|
17
|
-
$libs << " bigdecimal-$(arch).lib"
|
18
|
-
true
|
19
|
-
else
|
20
|
-
false
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
create_makefile('bigdecimal/util')
|