bigdecimal 1.4.4 → 2.0.0
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 +2 -3
- data/ext/bigdecimal/bigdecimal.c +83 -41
- data/ext/bigdecimal/extconf.rb +4 -0
- data/lib/bigdecimal.rb +1 -22
- data/lib/bigdecimal/jacobian.rb +3 -4
- data/lib/bigdecimal/util.rb +33 -0
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fe17cbc3e4c4013708f79a93c975f84b3b55c53028671ef217dde778438a909
|
4
|
+
data.tar.gz: 5ec9c5839c1ff24a1d08bca8087fff348ec5eaf5aeac910ebb4c972dc00b7b20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 653b43d52285c5b25dbef5a4ced242d289b966699e099ae37f122a120e924cabd484a534df3d62c1c2e03ae76fefdb874564631bcdd617f041b664b42c34d981
|
7
|
+
data.tar.gz: 0cc5144ca6df649f27338327021bc7644cd55f7834ff035e473b9abb68d821ea28f9a89f3e6210224547cce0be0c0a56bc9c72d89e63b8446407f2f3ef4ff602
|
data/bigdecimal.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
bigdecimal_version = '
|
3
|
+
bigdecimal_version = '2.0.0'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "bigdecimal"
|
@@ -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
35
|
s.add_development_dependency "rake", "~> 10.0"
|
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
@@ -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 */
|
@@ -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,12 +1778,15 @@ 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
|
*
|
@@ -2027,7 +2052,6 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2027
2052
|
if (rb_scan_args(argc, argv, "01", &f) == 1) {
|
2028
2053
|
if (RB_TYPE_P(f, T_STRING)) {
|
2029
2054
|
psz = StringValueCStr(f);
|
2030
|
-
rb_check_safe_obj(f);
|
2031
2055
|
if (*psz == ' ') {
|
2032
2056
|
fPlus = 1;
|
2033
2057
|
psz++;
|
@@ -2560,6 +2584,10 @@ BigDecimal_clone(VALUE self)
|
|
2560
2584
|
return self;
|
2561
2585
|
}
|
2562
2586
|
|
2587
|
+
#ifdef HAVE_RB_OPTS_EXCEPTION_P
|
2588
|
+
int rb_opts_exception_p(VALUE opts, int default_value);
|
2589
|
+
#define opts_exception_p(opts) rb_opts_exception_p((opts), 1)
|
2590
|
+
#else
|
2563
2591
|
static int
|
2564
2592
|
opts_exception_p(VALUE opts)
|
2565
2593
|
{
|
@@ -2568,12 +2596,20 @@ opts_exception_p(VALUE opts)
|
|
2568
2596
|
if (!kwds[0]) {
|
2569
2597
|
kwds[0] = rb_intern_const("exception");
|
2570
2598
|
}
|
2571
|
-
rb_get_kwargs(opts, kwds, 0, 1, &exception);
|
2599
|
+
if (!rb_get_kwargs(opts, kwds, 0, 1, &exception)) return 1;
|
2600
|
+
switch (exception) {
|
2601
|
+
case Qtrue: case Qfalse:
|
2602
|
+
break;
|
2603
|
+
default:
|
2604
|
+
rb_raise(rb_eArgError, "true or false is expected as exception: %+"PRIsVALUE,
|
2605
|
+
exception);
|
2606
|
+
}
|
2572
2607
|
return exception != Qfalse;
|
2573
2608
|
}
|
2609
|
+
#endif
|
2574
2610
|
|
2575
2611
|
static Real *
|
2576
|
-
|
2612
|
+
VpNewVarArg(int argc, VALUE *argv)
|
2577
2613
|
{
|
2578
2614
|
size_t mf;
|
2579
2615
|
VALUE opts = Qnil;
|
@@ -2616,6 +2652,7 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2616
2652
|
}
|
2617
2653
|
}
|
2618
2654
|
|
2655
|
+
retry:
|
2619
2656
|
switch (TYPE(iniValue)) {
|
2620
2657
|
case T_DATA:
|
2621
2658
|
if (is_kind_of_BigDecimal(iniValue)) {
|
@@ -2653,6 +2690,18 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2653
2690
|
}
|
2654
2691
|
return GetVpValueWithPrec(iniValue, mf, 1);
|
2655
2692
|
|
2693
|
+
case T_COMPLEX:
|
2694
|
+
{
|
2695
|
+
VALUE im;
|
2696
|
+
im = rb_complex_imag(iniValue);
|
2697
|
+
if (!is_zero(im)) {
|
2698
|
+
rb_raise(rb_eArgError,
|
2699
|
+
"Unable to make a BigDecimal from non-zero imaginary number");
|
2700
|
+
}
|
2701
|
+
iniValue = rb_complex_real(iniValue);
|
2702
|
+
goto retry;
|
2703
|
+
}
|
2704
|
+
|
2656
2705
|
case T_STRING:
|
2657
2706
|
/* fall through */
|
2658
2707
|
default:
|
@@ -2667,23 +2716,6 @@ VpNewVarArgs(int argc, VALUE *argv)
|
|
2667
2716
|
return VpAlloc(mf, RSTRING_PTR(iniValue), 1, exc);
|
2668
2717
|
}
|
2669
2718
|
|
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
2719
|
/* call-seq:
|
2688
2720
|
* BigDecimal(initial, digits, exception: true)
|
2689
2721
|
*
|
@@ -2723,28 +2755,35 @@ BigDecimal_new(int argc, VALUE *argv, VALUE klass)
|
|
2723
2755
|
static VALUE
|
2724
2756
|
f_BigDecimal(int argc, VALUE *argv, VALUE self)
|
2725
2757
|
{
|
2726
|
-
|
2758
|
+
ENTER(1);
|
2759
|
+
Real *pv;
|
2760
|
+
VALUE obj;
|
2761
|
+
|
2762
|
+
if (argc > 0 && CLASS_OF(argv[0]) == rb_cBigDecimal) {
|
2763
|
+
if (argc == 1 || (argc == 2 && RB_TYPE_P(argv[1], T_HASH))) return argv[0];
|
2764
|
+
}
|
2765
|
+
obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, 0);
|
2766
|
+
pv = VpNewVarArg(argc, argv);
|
2767
|
+
if (pv == NULL) return Qnil;
|
2768
|
+
SAVE(pv);
|
2769
|
+
if (ToValue(pv)) pv = VpCopy(NULL, pv);
|
2770
|
+
RTYPEDDATA_DATA(obj) = pv;
|
2771
|
+
RB_OBJ_FREEZE(obj);
|
2772
|
+
return pv->obj = obj;
|
2727
2773
|
}
|
2728
2774
|
|
2729
2775
|
static VALUE
|
2730
2776
|
BigDecimal_s_interpret_loosely(VALUE klass, VALUE str)
|
2731
2777
|
{
|
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
|
-
}
|
2778
|
+
ENTER(1);
|
2779
|
+
char const *c_str;
|
2780
|
+
Real *pv;
|
2742
2781
|
|
2743
|
-
|
2744
|
-
|
2745
|
-
|
2746
|
-
|
2747
|
-
return
|
2782
|
+
c_str = StringValueCStr(str);
|
2783
|
+
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
|
2784
|
+
pv->obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, pv);
|
2785
|
+
RB_OBJ_FREEZE(pv->obj);
|
2786
|
+
return pv->obj;
|
2748
2787
|
}
|
2749
2788
|
|
2750
2789
|
/* call-seq:
|
@@ -2966,6 +3005,10 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2966
3005
|
n = prec + rmpd_double_figures();
|
2967
3006
|
negative = BIGDECIMAL_NEGATIVE_P(vx);
|
2968
3007
|
if (negative) {
|
3008
|
+
VALUE x_zero = INT2NUM(1);
|
3009
|
+
VALUE x_copy = f_BigDecimal(1, &x_zero, klass);
|
3010
|
+
x = BigDecimal_initialize_copy(x_copy, x);
|
3011
|
+
vx = DATA_PTR(x);
|
2969
3012
|
VpSetSign(vx, 1);
|
2970
3013
|
}
|
2971
3014
|
|
@@ -3312,8 +3355,8 @@ Init_bigdecimal(void)
|
|
3312
3355
|
|
3313
3356
|
/* Class methods */
|
3314
3357
|
rb_undef_method(CLASS_OF(rb_cBigDecimal), "allocate");
|
3358
|
+
rb_undef_method(CLASS_OF(rb_cBigDecimal), "new");
|
3315
3359
|
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
3360
|
rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
|
3318
3361
|
rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1);
|
3319
3362
|
rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0);
|
@@ -3444,7 +3487,6 @@ Init_bigdecimal(void)
|
|
3444
3487
|
|
3445
3488
|
|
3446
3489
|
/* instance methods */
|
3447
|
-
rb_define_method(rb_cBigDecimal, "initialize_copy", BigDecimal_initialize_copy, 1);
|
3448
3490
|
rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
|
3449
3491
|
|
3450
3492
|
rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);
|
data/ext/bigdecimal/extconf.rb
CHANGED
@@ -36,8 +36,12 @@ 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")
|
41
45
|
|
42
46
|
if File.file?(File.expand_path('../lib/bigdecimal.rb', __FILE__))
|
43
47
|
bigdecimal_rb = "$(srcdir)/lib/bigdecimal.rb"
|
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'
|
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
@@ -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
|
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.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: 2019-
|
13
|
+
date: 2019-12-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -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
|
@@ -116,7 +102,7 @@ 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
|
- - ">="
|