bigdecimal 1.4.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bigdecimal.gemspec +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
|
- - ">="
|