bigdecimal 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bigdecimal.c +60 -42
- data/bigdecimal.gemspec +1 -1
- data/lib/bigdecimal/util.rb +28 -6
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c97cb6ce62111804b296b14c294e00833500b5d9
|
4
|
+
data.tar.gz: d6c8d262b5acb0d1e5ff652ffc2b63a5acad8c21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d69e3aa32a795c3ff76b080198867a7cff700a87ad373be151ead80f9035168216139c0db73d5c1bce8fd044cd863ef21cac7351b0d49b30fe35829b7696404a
|
7
|
+
data.tar.gz: ca5224f1997fb8c31decf7b41a26a05134efd6b6f5284dc576c89c6d51061eb58d51d72b5f05c008e063c5c73646aab167c4ef4fc226981b99ebf4ba0ac84070
|
data/bigdecimal.c
CHANGED
@@ -146,6 +146,9 @@ BigDecimal_memsize(const void *ptr)
|
|
146
146
|
static const rb_data_type_t BigDecimal_data_type = {
|
147
147
|
"BigDecimal",
|
148
148
|
{ 0, BigDecimal_delete, BigDecimal_memsize, },
|
149
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
150
|
+
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
151
|
+
#endif
|
149
152
|
};
|
150
153
|
|
151
154
|
static inline int
|
@@ -449,10 +452,10 @@ check_rounding_mode(VALUE const v)
|
|
449
452
|
* When computation continues, results are as follows:
|
450
453
|
*
|
451
454
|
* EXCEPTION_NaN:: NaN
|
452
|
-
* EXCEPTION_INFINITY:: +
|
455
|
+
* EXCEPTION_INFINITY:: +Infinity or -Infinity
|
453
456
|
* EXCEPTION_UNDERFLOW:: 0
|
454
|
-
* EXCEPTION_OVERFLOW:: +
|
455
|
-
* EXCEPTION_ZERODIVIDE:: +
|
457
|
+
* EXCEPTION_OVERFLOW:: +Infinity or -Infinity
|
458
|
+
* EXCEPTION_ZERODIVIDE:: +Infinity or -Infinity
|
456
459
|
*
|
457
460
|
* One value of the mode parameter controls the rounding of numeric values:
|
458
461
|
* BigDecimal::ROUND_MODE. The values it can take are:
|
@@ -598,7 +601,7 @@ BigDecimal_IsNaN(VALUE self)
|
|
598
601
|
}
|
599
602
|
|
600
603
|
/* Returns nil, -1, or +1 depending on whether the value is finite,
|
601
|
-
* -
|
604
|
+
* -Infinity, or +Infinity.
|
602
605
|
*/
|
603
606
|
static VALUE
|
604
607
|
BigDecimal_IsInfinite(VALUE self)
|
@@ -1590,10 +1593,10 @@ BigDecimal_sqrt(VALUE self, VALUE nFig)
|
|
1590
1593
|
size_t mx, n;
|
1591
1594
|
|
1592
1595
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1593
|
-
mx = a->Prec *(VpBaseFig() + 1);
|
1596
|
+
mx = a->Prec * (VpBaseFig() + 1);
|
1594
1597
|
|
1595
|
-
n = GetPositiveInt(nFig) + VpDblFig() +
|
1596
|
-
if(mx <= n) mx = n;
|
1598
|
+
n = GetPositiveInt(nFig) + VpDblFig() + BASE_FIG;
|
1599
|
+
if (mx <= n) mx = n;
|
1597
1600
|
GUARD_OBJ(c, VpCreateRbObject(mx, "0"));
|
1598
1601
|
VpSqrt(c, a);
|
1599
1602
|
return ToValue(c);
|
@@ -2380,6 +2383,9 @@ retry:
|
|
2380
2383
|
GUARD_OBJ(y, VpCreateRbObject(1, "0"));
|
2381
2384
|
}
|
2382
2385
|
VpPower(y, x, int_exp);
|
2386
|
+
if (VpIsDef(y)) {
|
2387
|
+
VpMidRound(y, VpGetRoundMode(), n);
|
2388
|
+
}
|
2383
2389
|
return ToValue(y);
|
2384
2390
|
}
|
2385
2391
|
|
@@ -2552,8 +2558,8 @@ BigDecimal_limit(int argc, VALUE *argv, VALUE self)
|
|
2552
2558
|
* BigDecimal::SIGN_NaN:: value is Not a Number
|
2553
2559
|
* BigDecimal::SIGN_POSITIVE_ZERO:: value is +0
|
2554
2560
|
* BigDecimal::SIGN_NEGATIVE_ZERO:: value is -0
|
2555
|
-
* BigDecimal::SIGN_POSITIVE_INFINITE:: value is +
|
2556
|
-
* BigDecimal::SIGN_NEGATIVE_INFINITE:: value is -
|
2561
|
+
* BigDecimal::SIGN_POSITIVE_INFINITE:: value is +Infinity
|
2562
|
+
* BigDecimal::SIGN_NEGATIVE_INFINITE:: value is -Infinity
|
2557
2563
|
* BigDecimal::SIGN_POSITIVE_FINITE:: value is positive
|
2558
2564
|
* BigDecimal::SIGN_NEGATIVE_FINITE:: value is negative
|
2559
2565
|
*/
|
@@ -2673,18 +2679,18 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2673
2679
|
* BigDecimalCmp function. */
|
2674
2680
|
switch (TYPE(x)) {
|
2675
2681
|
case T_DATA:
|
2676
|
-
|
2677
|
-
|
2678
|
-
|
2679
|
-
|
2680
|
-
|
2681
|
-
|
2682
|
+
if (!is_kind_of_BigDecimal(x)) break;
|
2683
|
+
vx = DATA_PTR(x);
|
2684
|
+
negative = VpGetSign(vx) < 0;
|
2685
|
+
infinite = VpIsPosInf(vx) || VpIsNegInf(vx);
|
2686
|
+
nan = VpIsNaN(vx);
|
2687
|
+
break;
|
2682
2688
|
|
2683
2689
|
case T_FIXNUM:
|
2684
|
-
|
2690
|
+
/* fall through */
|
2685
2691
|
case T_BIGNUM:
|
2686
|
-
|
2687
|
-
|
2692
|
+
vx = GetVpValue(x, 0);
|
2693
|
+
break;
|
2688
2694
|
|
2689
2695
|
case T_FLOAT:
|
2690
2696
|
flo = RFLOAT_VALUE(x);
|
@@ -2710,22 +2716,22 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2710
2716
|
else {
|
2711
2717
|
Real* vy;
|
2712
2718
|
vy = VpCreateRbObject(prec, "#0");
|
2713
|
-
RB_GC_GUARD(vy->obj);
|
2714
2719
|
VpSetInf(vy, VP_SIGN_POSITIVE_INFINITE);
|
2720
|
+
RB_GC_GUARD(vy->obj);
|
2715
2721
|
return ToValue(vy);
|
2716
2722
|
}
|
2717
2723
|
}
|
2718
2724
|
else if (nan) {
|
2719
2725
|
Real* vy;
|
2720
2726
|
vy = VpCreateRbObject(prec, "#0");
|
2721
|
-
RB_GC_GUARD(vy->obj);
|
2722
2727
|
VpSetNaN(vy);
|
2728
|
+
RB_GC_GUARD(vy->obj);
|
2723
2729
|
return ToValue(vy);
|
2724
2730
|
}
|
2725
2731
|
else if (vx == NULL) {
|
2726
2732
|
cannot_be_coerced_into_BigDecimal(rb_eArgError, x);
|
2727
2733
|
}
|
2728
|
-
x =
|
2734
|
+
x = vx->obj;
|
2729
2735
|
|
2730
2736
|
n = prec + rmpd_double_figures();
|
2731
2737
|
negative = VpGetSign(vx) < 0;
|
@@ -2733,18 +2739,21 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2733
2739
|
VpSetSign(vx, 1);
|
2734
2740
|
}
|
2735
2741
|
|
2736
|
-
|
2737
|
-
|
2738
|
-
|
2739
|
-
|
2740
|
-
|
2741
|
-
i
|
2742
|
+
one = ToValue(VpCreateRbObject(1, "1"));
|
2743
|
+
x1 = one;
|
2744
|
+
y = one;
|
2745
|
+
d = y;
|
2746
|
+
z = one;
|
2747
|
+
i = 0;
|
2742
2748
|
|
2743
2749
|
while (!VpIsZero((Real*)DATA_PTR(d))) {
|
2744
2750
|
VALUE argv[2];
|
2745
2751
|
SIGNED_VALUE const ey = VpExponent10(DATA_PTR(y));
|
2746
2752
|
SIGNED_VALUE const ed = VpExponent10(DATA_PTR(d));
|
2747
2753
|
ssize_t m = n - vabs(ey - ed);
|
2754
|
+
|
2755
|
+
rb_thread_check_ints();
|
2756
|
+
|
2748
2757
|
if (m <= 0) {
|
2749
2758
|
break;
|
2750
2759
|
}
|
@@ -2771,6 +2780,13 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
|
|
2771
2780
|
vprec = SSIZET2NUM(prec - VpExponent10(DATA_PTR(y)));
|
2772
2781
|
return BigDecimal_round(1, &vprec, y);
|
2773
2782
|
}
|
2783
|
+
|
2784
|
+
RB_GC_GUARD(one);
|
2785
|
+
RB_GC_GUARD(x);
|
2786
|
+
RB_GC_GUARD(x1);
|
2787
|
+
RB_GC_GUARD(y);
|
2788
|
+
RB_GC_GUARD(d);
|
2789
|
+
RB_GC_GUARD(z);
|
2774
2790
|
}
|
2775
2791
|
|
2776
2792
|
/* call-seq:
|
@@ -2957,7 +2973,7 @@ get_vp_value:
|
|
2957
2973
|
* For example, try:
|
2958
2974
|
*
|
2959
2975
|
* sum = 0
|
2960
|
-
*
|
2976
|
+
* 10_000.times do
|
2961
2977
|
* sum = sum + 0.0001
|
2962
2978
|
* end
|
2963
2979
|
* print sum #=> 0.9999999999999062
|
@@ -2967,7 +2983,7 @@ get_vp_value:
|
|
2967
2983
|
* require 'bigdecimal'
|
2968
2984
|
*
|
2969
2985
|
* sum = BigDecimal.new("0")
|
2970
|
-
*
|
2986
|
+
* 10_000.times do
|
2971
2987
|
* sum = sum + BigDecimal.new("0.0001")
|
2972
2988
|
* end
|
2973
2989
|
* print sum #=> 0.1E1
|
@@ -2988,8 +3004,8 @@ get_vp_value:
|
|
2988
3004
|
* BigDecimal sometimes needs to return infinity, for example if you divide
|
2989
3005
|
* a value by zero.
|
2990
3006
|
*
|
2991
|
-
* BigDecimal.new("1.0") / BigDecimal.new("0.0") #=>
|
2992
|
-
* BigDecimal.new("-1.0") / BigDecimal.new("0.0") #=> -
|
3007
|
+
* BigDecimal.new("1.0") / BigDecimal.new("0.0") #=> Infinity
|
3008
|
+
* BigDecimal.new("-1.0") / BigDecimal.new("0.0") #=> -Infinity
|
2993
3009
|
*
|
2994
3010
|
* You can represent infinite numbers to BigDecimal using the strings
|
2995
3011
|
* <code>'Infinity'</code>, <code>'+Infinity'</code> and
|
@@ -3009,8 +3025,8 @@ get_vp_value:
|
|
3009
3025
|
* NaN is never considered to be the same as any other value, even NaN itself:
|
3010
3026
|
*
|
3011
3027
|
* n = BigDecimal.new('NaN')
|
3012
|
-
* n == 0.0 #=>
|
3013
|
-
* n == n #=>
|
3028
|
+
* n == 0.0 #=> false
|
3029
|
+
* n == n #=> false
|
3014
3030
|
*
|
3015
3031
|
* === Positive and negative zero
|
3016
3032
|
*
|
@@ -3152,10 +3168,10 @@ Init_bigdecimal(void)
|
|
3152
3168
|
* See BigDecimal.mode.
|
3153
3169
|
*/
|
3154
3170
|
rb_define_const(rb_cBigDecimal, "ROUND_HALF_DOWN", INT2FIX(VP_ROUND_HALF_DOWN));
|
3155
|
-
/* 5: Round towards +
|
3171
|
+
/* 5: Round towards +Infinity. See BigDecimal.mode. */
|
3156
3172
|
rb_define_const(rb_cBigDecimal, "ROUND_CEILING", INT2FIX(VP_ROUND_CEIL));
|
3157
3173
|
|
3158
|
-
/* 6: Round towards -
|
3174
|
+
/* 6: Round towards -Infinity. See BigDecimal.mode. */
|
3159
3175
|
rb_define_const(rb_cBigDecimal, "ROUND_FLOOR", INT2FIX(VP_ROUND_FLOOR));
|
3160
3176
|
|
3161
3177
|
/* 7: Round towards the even neighbor. See BigDecimal.mode. */
|
@@ -3815,7 +3831,9 @@ VpAlloc(size_t mx, const char *szVal)
|
|
3815
3831
|
size_t mf = VpGetPrecLimit();
|
3816
3832
|
VALUE buf;
|
3817
3833
|
|
3818
|
-
mx = (mx + BASE_FIG - 1) / BASE_FIG
|
3834
|
+
mx = (mx + BASE_FIG - 1) / BASE_FIG; /* Determine allocation unit. */
|
3835
|
+
if (mx == 0) ++mx;
|
3836
|
+
|
3819
3837
|
if (szVal) {
|
3820
3838
|
while (ISSPACE(*szVal)) szVal++;
|
3821
3839
|
if (*szVal != '#') {
|
@@ -3936,7 +3954,7 @@ VpAlloc(size_t mx, const char *szVal)
|
|
3936
3954
|
}
|
3937
3955
|
nalloc = (ni + nf + BASE_FIG - 1) / BASE_FIG + 1; /* set effective allocation */
|
3938
3956
|
/* units for szVal[] */
|
3939
|
-
if (mx
|
3957
|
+
if (mx == 0) mx = 1;
|
3940
3958
|
nalloc = Max(nalloc, mx);
|
3941
3959
|
mx = nalloc;
|
3942
3960
|
vp = VpAllocReal(mx);
|
@@ -5029,7 +5047,7 @@ VpFormatSt(char *psz, size_t fFmt)
|
|
5029
5047
|
size_t ie, i, nf = 0;
|
5030
5048
|
char ch;
|
5031
5049
|
|
5032
|
-
if (fFmt
|
5050
|
+
if (fFmt == 0) return;
|
5033
5051
|
|
5034
5052
|
ie = strlen(psz);
|
5035
5053
|
for (i = 0; i < ie; ++i) {
|
@@ -5653,6 +5671,7 @@ VpSqrt(Real *y, Real *x)
|
|
5653
5671
|
|
5654
5672
|
n = (SIGNED_VALUE)y->MaxPrec;
|
5655
5673
|
if (x->MaxPrec > (size_t)n) n = (ssize_t)x->MaxPrec;
|
5674
|
+
|
5656
5675
|
/* allocate temporally variables */
|
5657
5676
|
f = VpAlloc(y->MaxPrec * (BASE_FIG + 2), "#1");
|
5658
5677
|
r = VpAlloc((n + n) * (BASE_FIG + 2), "#1");
|
@@ -5690,8 +5709,7 @@ VpSqrt(Real *y, Real *x)
|
|
5690
5709
|
if (VpIsZero(f)) goto converge;
|
5691
5710
|
VpAddSub(r, f, y, 1); /* r = y + f */
|
5692
5711
|
VpAsgn(y, r, 1); /* y = r */
|
5693
|
-
|
5694
|
-
} while(++nr < n);
|
5712
|
+
} while (++nr < n);
|
5695
5713
|
|
5696
5714
|
#ifdef BIGDECIMAL_DEBUG
|
5697
5715
|
if (gfDebug) {
|
@@ -6162,12 +6180,12 @@ VpVarCheck(Real * v)
|
|
6162
6180
|
{
|
6163
6181
|
size_t i;
|
6164
6182
|
|
6165
|
-
if (v->MaxPrec
|
6183
|
+
if (v->MaxPrec == 0) {
|
6166
6184
|
printf("ERROR(VpVarCheck): Illegal Max. Precision(=%"PRIuSIZE")\n",
|
6167
6185
|
v->MaxPrec);
|
6168
6186
|
return 1;
|
6169
6187
|
}
|
6170
|
-
if (v->Prec
|
6188
|
+
if (v->Prec == 0 || v->Prec > v->MaxPrec) {
|
6171
6189
|
printf("ERROR(VpVarCheck): Illegal Precision(=%"PRIuSIZE")\n", v->Prec);
|
6172
6190
|
printf(" Max. Prec.=%"PRIuSIZE"\n", v->MaxPrec);
|
6173
6191
|
return 2;
|
data/bigdecimal.gemspec
CHANGED
data/lib/bigdecimal/util.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# BigDecimal extends the native Integer class to provide the #to_d method.
|
2
|
+
#
|
3
|
+
# When you require the BigDecimal library in your application, this methodwill
|
4
|
+
# be available on Integer objects.
|
1
5
|
class Integer < Numeric
|
2
6
|
# call-seq:
|
3
7
|
# int.to_d -> bigdecimal
|
@@ -15,6 +19,10 @@ class Integer < Numeric
|
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
22
|
+
# BigDecimal extends the native Float class to provide the #to_d method.
|
23
|
+
#
|
24
|
+
# When you require BigDecimal in your application, this method will be
|
25
|
+
# available on Float objects.
|
18
26
|
class Float < Numeric
|
19
27
|
# call-seq:
|
20
28
|
# flt.to_d -> bigdecimal
|
@@ -32,6 +40,10 @@ class Float < Numeric
|
|
32
40
|
end
|
33
41
|
end
|
34
42
|
|
43
|
+
# BigDecimal extends the native String class to provide the #to_d method.
|
44
|
+
#
|
45
|
+
# When you require BigDecimal in your application, this method will be
|
46
|
+
# available on String objects.
|
35
47
|
class String
|
36
48
|
# call-seq:
|
37
49
|
# string.to_d -> bigdecimal
|
@@ -49,6 +61,11 @@ class String
|
|
49
61
|
end
|
50
62
|
end
|
51
63
|
|
64
|
+
# BigDecimal extends the native Numeric class to provide the #to_digits and
|
65
|
+
# #to_d methods.
|
66
|
+
#
|
67
|
+
# When you require BigDecimal in your application, this method will be
|
68
|
+
# available on BigDecimal objects.
|
52
69
|
class BigDecimal < Numeric
|
53
70
|
# call-seq:
|
54
71
|
# a.to_digits -> string
|
@@ -81,18 +98,23 @@ class BigDecimal < Numeric
|
|
81
98
|
end
|
82
99
|
end
|
83
100
|
|
101
|
+
# BigDecimal extends the native Rational class to provide the #to_d method.
|
102
|
+
#
|
103
|
+
# When you require BigDecimal in your application, this method will be
|
104
|
+
# available on Rational objects.
|
84
105
|
class Rational < Numeric
|
85
106
|
# call-seq:
|
86
|
-
# r.to_d
|
87
|
-
# r.to_d(sig) -> bigdecimal
|
107
|
+
# r.to_d(precision) -> bigdecimal
|
88
108
|
#
|
89
|
-
# Converts a Rational to a BigDecimal.
|
90
|
-
#
|
109
|
+
# Converts a Rational to a BigDecimal.
|
110
|
+
#
|
111
|
+
# The required +precision+ parameter is used to determine the amount of
|
112
|
+
# significant digits for the result. See BigDecimal#div for more information,
|
113
|
+
# as it is used along with the #denominator and the +precision+ for
|
114
|
+
# parameters.
|
91
115
|
#
|
92
116
|
# r = (22/7.0).to_r
|
93
117
|
# # => (7077085128725065/2251799813685248)
|
94
|
-
# r.to_d
|
95
|
-
# # => #<BigDecimal:1a52bd8,'0.3142857142 8571427937 0154144999 105E1',45(63)>
|
96
118
|
# r.to_d(3)
|
97
119
|
# # => #<BigDecimal:1a44d08,'0.314E1',18(36)>
|
98
120
|
def to_d(precision)
|
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: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenta Murata
|
@@ -53,8 +53,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
55
|
rubyforge_project:
|
56
|
-
rubygems_version: 2.0.
|
56
|
+
rubygems_version: 2.0.3
|
57
57
|
signing_key:
|
58
58
|
specification_version: 4
|
59
59
|
summary: Arbitrary-precision decimal floating-point number library.
|
60
60
|
test_files: []
|
61
|
+
has_rdoc:
|