bigdecimal 1.4.0.pre.20181130a → 1.4.0.pre.20181204a
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bigdecimal.gemspec +1 -1
- data/ext/bigdecimal/bigdecimal.c +75 -48
- data/ext/bigdecimal/bigdecimal.h +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd175d854d1fbce48f6f894247f0e93b8c47f8ab44311d3802dfd6251736aeee
|
4
|
+
data.tar.gz: 6c0f0986a74dc44bc89e02f18349fab3042e9459bff242f9437a00e10f0d34b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4ba585b71f0a72653a115e544febe08f0db4b7aa56c8d74bfa265b573ddefafd8fea4cc1968df3154b573dca2906594a6c83ed1b0482b0cd73c3b1cd9d1972a
|
7
|
+
data.tar.gz: afeb4fc25449a1ee18500a095be5ffcbffe6bc450fd42da510f49f79cea840da4f7a2add6297896f57c703c30fbb5d634ad6b96b9bca8702e10ef93aaff8dcc8
|
data/bigdecimal.gemspec
CHANGED
data/ext/bigdecimal/bigdecimal.c
CHANGED
@@ -646,7 +646,7 @@ VP_EXPORT Real *
|
|
646
646
|
VpNewRbClass(size_t mx, const char *str, VALUE klass)
|
647
647
|
{
|
648
648
|
VALUE obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, 0);
|
649
|
-
Real *pv = VpAlloc(mx, str, 1);
|
649
|
+
Real *pv = VpAlloc(mx, str, 1, 1);
|
650
650
|
RTYPEDDATA_DATA(obj) = pv;
|
651
651
|
pv->obj = obj;
|
652
652
|
RB_OBJ_FREEZE(obj);
|
@@ -2538,28 +2538,6 @@ BigDecimal_power_op(VALUE self, VALUE exp)
|
|
2538
2538
|
return BigDecimal_power(1, &exp, self);
|
2539
2539
|
}
|
2540
2540
|
|
2541
|
-
static Real *BigDecimal_new(int argc, VALUE *argv);
|
2542
|
-
|
2543
|
-
static VALUE
|
2544
|
-
BigDecimal_initialize(int argc, VALUE *argv, VALUE self)
|
2545
|
-
{
|
2546
|
-
ENTER(1);
|
2547
|
-
Real *pv = rb_check_typeddata(self, &BigDecimal_data_type);
|
2548
|
-
Real *x;
|
2549
|
-
|
2550
|
-
GUARD_OBJ(x, BigDecimal_new(argc, argv));
|
2551
|
-
if (ToValue(x)) {
|
2552
|
-
pv = VpCopy(pv, x);
|
2553
|
-
}
|
2554
|
-
else {
|
2555
|
-
VpFree(pv);
|
2556
|
-
pv = x;
|
2557
|
-
}
|
2558
|
-
DATA_PTR(self) = pv;
|
2559
|
-
pv->obj = self;
|
2560
|
-
return self;
|
2561
|
-
}
|
2562
|
-
|
2563
2541
|
/* :nodoc:
|
2564
2542
|
*
|
2565
2543
|
* private method for dup and clone the provided BigDecimal +other+
|
@@ -2582,19 +2560,60 @@ BigDecimal_clone(VALUE self)
|
|
2582
2560
|
return self;
|
2583
2561
|
}
|
2584
2562
|
|
2563
|
+
static int
|
2564
|
+
opts_exception_p(VALUE opts)
|
2565
|
+
{
|
2566
|
+
static ID kwds[1];
|
2567
|
+
VALUE exception;
|
2568
|
+
if (!kwds[0]) {
|
2569
|
+
kwds[0] = rb_intern_const("exception");
|
2570
|
+
}
|
2571
|
+
rb_get_kwargs(opts, kwds, 0, 1, &exception);
|
2572
|
+
return exception != Qfalse;
|
2573
|
+
}
|
2574
|
+
|
2585
2575
|
static Real *
|
2586
2576
|
BigDecimal_new(int argc, VALUE *argv)
|
2587
2577
|
{
|
2588
2578
|
size_t mf;
|
2579
|
+
VALUE opts = Qnil;
|
2589
2580
|
VALUE nFig;
|
2590
2581
|
VALUE iniValue;
|
2591
2582
|
double d;
|
2583
|
+
int exc;
|
2592
2584
|
|
2593
|
-
|
2585
|
+
argc = rb_scan_args(argc, argv, "11:", &iniValue, &nFig, &opts);
|
2586
|
+
exc = opts_exception_p(opts);
|
2587
|
+
|
2588
|
+
if (argc == 1) {
|
2594
2589
|
mf = 0;
|
2595
2590
|
}
|
2596
2591
|
else {
|
2597
|
-
|
2592
|
+
/* expand GetPrecisionInt for exception suppression */
|
2593
|
+
ssize_t n = NUM2INT(nFig);
|
2594
|
+
if (n < 0) {
|
2595
|
+
if (!exc) {
|
2596
|
+
return NULL;
|
2597
|
+
}
|
2598
|
+
rb_raise(rb_eArgError, "negative precision");
|
2599
|
+
}
|
2600
|
+
mf = (size_t)n;
|
2601
|
+
}
|
2602
|
+
|
2603
|
+
if (SPECIAL_CONST_P(iniValue)) {
|
2604
|
+
switch (iniValue) {
|
2605
|
+
case Qnil:
|
2606
|
+
if (!exc) return NULL;
|
2607
|
+
rb_raise(rb_eTypeError, "can't convert nil into BigDecimal");
|
2608
|
+
case Qtrue:
|
2609
|
+
if (!exc) return NULL;
|
2610
|
+
rb_raise(rb_eTypeError, "can't convert true into BigDecimal");
|
2611
|
+
case Qfalse:
|
2612
|
+
if (!exc) return NULL;
|
2613
|
+
rb_raise(rb_eTypeError, "can't convert false into BigDecimal");
|
2614
|
+
default:
|
2615
|
+
break;
|
2616
|
+
}
|
2598
2617
|
}
|
2599
2618
|
|
2600
2619
|
switch (TYPE(iniValue)) {
|
@@ -2617,11 +2636,17 @@ BigDecimal_new(int argc, VALUE *argv)
|
|
2617
2636
|
return pv;
|
2618
2637
|
}
|
2619
2638
|
if (mf > DBL_DIG+1) {
|
2639
|
+
if (!exc) {
|
2640
|
+
return NULL;
|
2641
|
+
}
|
2620
2642
|
rb_raise(rb_eArgError, "precision too large.");
|
2621
2643
|
}
|
2622
2644
|
/* fall through */
|
2623
2645
|
case T_RATIONAL:
|
2624
2646
|
if (NIL_P(nFig)) {
|
2647
|
+
if (!exc) {
|
2648
|
+
return NULL;
|
2649
|
+
}
|
2625
2650
|
rb_raise(rb_eArgError,
|
2626
2651
|
"can't omit precision for a %"PRIsVALUE".",
|
2627
2652
|
RB_OBJ_CLASSNAME(iniValue));
|
@@ -2633,8 +2658,13 @@ BigDecimal_new(int argc, VALUE *argv)
|
|
2633
2658
|
default:
|
2634
2659
|
break;
|
2635
2660
|
}
|
2661
|
+
/* TODO: support to_d */
|
2662
|
+
if (!exc) {
|
2663
|
+
iniValue = rb_check_convert_type(iniValue, T_STRING, "String", "to_str");
|
2664
|
+
if (NIL_P(iniValue)) return NULL;
|
2665
|
+
}
|
2636
2666
|
StringValueCStr(iniValue);
|
2637
|
-
return VpAlloc(mf, RSTRING_PTR(iniValue), 1);
|
2667
|
+
return VpAlloc(mf, RSTRING_PTR(iniValue), 1, exc);
|
2638
2668
|
}
|
2639
2669
|
|
2640
2670
|
/* call-seq:
|
@@ -2669,14 +2699,16 @@ BigDecimal_new(int argc, VALUE *argv)
|
|
2669
2699
|
* value is omitted, this exception is raised.
|
2670
2700
|
*/
|
2671
2701
|
static VALUE
|
2672
|
-
|
2702
|
+
f_BigDecimal(int argc, VALUE *argv, VALUE self)
|
2673
2703
|
{
|
2674
2704
|
ENTER(1);
|
2675
2705
|
Real *pv;
|
2676
2706
|
VALUE obj;
|
2677
2707
|
|
2678
2708
|
obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, 0);
|
2679
|
-
|
2709
|
+
pv = BigDecimal_new(argc, argv);
|
2710
|
+
if (pv == NULL) return Qnil;
|
2711
|
+
SAVE(pv);
|
2680
2712
|
if (ToValue(pv)) pv = VpCopy(NULL, pv);
|
2681
2713
|
RTYPEDDATA_DATA(obj) = pv;
|
2682
2714
|
RB_OBJ_FREEZE(obj);
|
@@ -3112,7 +3144,7 @@ rmpd_util_str_to_d(VALUE str)
|
|
3112
3144
|
VALUE obj;
|
3113
3145
|
|
3114
3146
|
c_str = StringValueCStr(str);
|
3115
|
-
GUARD_OBJ(pv, VpAlloc(0, c_str, 0));
|
3147
|
+
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
|
3116
3148
|
obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, pv);
|
3117
3149
|
RB_OBJ_FREEZE(obj);
|
3118
3150
|
return obj;
|
@@ -3259,7 +3291,7 @@ Init_bigdecimal(void)
|
|
3259
3291
|
rb_cBigDecimal = rb_define_class("BigDecimal", rb_cNumeric);
|
3260
3292
|
|
3261
3293
|
/* Global function */
|
3262
|
-
rb_define_global_function("BigDecimal",
|
3294
|
+
rb_define_global_function("BigDecimal", f_BigDecimal, -1);
|
3263
3295
|
|
3264
3296
|
/* Class methods */
|
3265
3297
|
rb_undef_method(CLASS_OF(rb_cBigDecimal), "allocate");
|
@@ -3387,14 +3419,13 @@ Init_bigdecimal(void)
|
|
3387
3419
|
|
3388
3420
|
arg = rb_str_new2("+Infinity");
|
3389
3421
|
/* Positive infinity value. */
|
3390
|
-
rb_define_const(rb_cBigDecimal, "INFINITY",
|
3422
|
+
rb_define_const(rb_cBigDecimal, "INFINITY", f_BigDecimal(1, &arg, rb_cBigDecimal));
|
3391
3423
|
arg = rb_str_new2("NaN");
|
3392
3424
|
/* 'Not a Number' value. */
|
3393
|
-
rb_define_const(rb_cBigDecimal, "NAN",
|
3425
|
+
rb_define_const(rb_cBigDecimal, "NAN", f_BigDecimal(1, &arg, rb_cBigDecimal));
|
3394
3426
|
|
3395
3427
|
|
3396
3428
|
/* instance methods */
|
3397
|
-
rb_define_method(rb_cBigDecimal, "initialize", BigDecimal_initialize, -1);
|
3398
3429
|
rb_define_method(rb_cBigDecimal, "initialize_copy", BigDecimal_initialize_copy, 1);
|
3399
3430
|
rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
|
3400
3431
|
|
@@ -3693,13 +3724,7 @@ VpSetRoundMode(unsigned short n)
|
|
3693
3724
|
* (to let the compiler know they may be changed in outside
|
3694
3725
|
* (... but not actually..)).
|
3695
3726
|
*/
|
3696
|
-
volatile const double gZero_ABCED9B1_CE73__00400511F31D = 0.0;
|
3697
3727
|
volatile const double gOne_ABCED9B4_CE73__00400511F31D = 1.0;
|
3698
|
-
static double
|
3699
|
-
Zero(void)
|
3700
|
-
{
|
3701
|
-
return gZero_ABCED9B1_CE73__00400511F31D;
|
3702
|
-
}
|
3703
3728
|
|
3704
3729
|
static double
|
3705
3730
|
One(void)
|
@@ -3937,8 +3962,8 @@ VpInit(BDIGIT BaseVal)
|
|
3937
3962
|
VpGetDoubleNegZero();
|
3938
3963
|
|
3939
3964
|
/* Allocates Vp constants. */
|
3940
|
-
VpConstOne = VpAlloc(1UL, "1", 1);
|
3941
|
-
VpPt5 = VpAlloc(1UL, ".5", 1);
|
3965
|
+
VpConstOne = VpAlloc(1UL, "1", 1, 1);
|
3966
|
+
VpPt5 = VpAlloc(1UL, ".5", 1, 1);
|
3942
3967
|
|
3943
3968
|
#ifdef BIGDECIMAL_DEBUG
|
3944
3969
|
gnAlloc = 0;
|
@@ -4062,7 +4087,7 @@ rmpd_parse_special_string(const char *str)
|
|
4062
4087
|
* NULL be returned if memory allocation is failed,or any error.
|
4063
4088
|
*/
|
4064
4089
|
VP_EXPORT Real *
|
4065
|
-
VpAlloc(size_t mx, const char *szVal, int strict_p)
|
4090
|
+
VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
|
4066
4091
|
{
|
4067
4092
|
const char *orig_szVal = szVal;
|
4068
4093
|
size_t i, j, ni, ipf, nf, ipe, ne, dot_seen, exp_seen, nalloc;
|
@@ -4261,7 +4286,9 @@ VpAlloc(size_t mx, const char *szVal, int strict_p)
|
|
4261
4286
|
if (!strict_p) {
|
4262
4287
|
goto return_zero;
|
4263
4288
|
}
|
4264
|
-
|
4289
|
+
if (!exc) {
|
4290
|
+
return NULL;
|
4291
|
+
}
|
4265
4292
|
str = rb_str_new2(orig_szVal);
|
4266
4293
|
rb_raise(rb_eArgError, "invalid value for BigDecimal(): \"%"PRIsVALUE"\"", str);
|
4267
4294
|
}
|
@@ -4838,7 +4865,7 @@ VpMult(Real *c, Real *a, Real *b)
|
|
4838
4865
|
|
4839
4866
|
if (MxIndC < MxIndAB) { /* The Max. prec. of c < Prec(a)+Prec(b) */
|
4840
4867
|
w = c;
|
4841
|
-
c = VpAlloc((size_t)((MxIndAB + 1) * BASE_FIG), "#0", 1);
|
4868
|
+
c = VpAlloc((size_t)((MxIndAB + 1) * BASE_FIG), "#0", 1, 1);
|
4842
4869
|
MxIndC = MxIndAB;
|
4843
4870
|
}
|
4844
4871
|
|
@@ -6006,8 +6033,8 @@ VpSqrt(Real *y, Real *x)
|
|
6006
6033
|
if (x->MaxPrec > (size_t)n) n = (ssize_t)x->MaxPrec;
|
6007
6034
|
|
6008
6035
|
/* allocate temporally variables */
|
6009
|
-
f = VpAlloc(y->MaxPrec * (BASE_FIG + 2), "#1", 1);
|
6010
|
-
r = VpAlloc((n + n) * (BASE_FIG + 2), "#1", 1);
|
6036
|
+
f = VpAlloc(y->MaxPrec * (BASE_FIG + 2), "#1", 1, 1);
|
6037
|
+
r = VpAlloc((n + n) * (BASE_FIG + 2), "#1", 1, 1);
|
6011
6038
|
|
6012
6039
|
nr = 0;
|
6013
6040
|
y_prec = y->MaxPrec;
|
@@ -6459,8 +6486,8 @@ VpPower(Real *y, Real *x, SIGNED_VALUE n)
|
|
6459
6486
|
|
6460
6487
|
/* Allocate working variables */
|
6461
6488
|
|
6462
|
-
w1 = VpAlloc((y->MaxPrec + 2) * BASE_FIG, "#0", 1);
|
6463
|
-
w2 = VpAlloc((w1->MaxPrec * 2 + 1) * BASE_FIG, "#0", 1);
|
6489
|
+
w1 = VpAlloc((y->MaxPrec + 2) * BASE_FIG, "#0", 1, 1);
|
6490
|
+
w2 = VpAlloc((w1->MaxPrec * 2 + 1) * BASE_FIG, "#0", 1, 1);
|
6464
6491
|
/* calculation start */
|
6465
6492
|
|
6466
6493
|
VpAsgn(y, x, 1);
|
data/ext/bigdecimal/bigdecimal.h
CHANGED
@@ -308,7 +308,7 @@ VP_EXPORT size_t VpInit(BDIGIT BaseVal);
|
|
308
308
|
VP_EXPORT void *VpMemAlloc(size_t mb);
|
309
309
|
VP_EXPORT void *VpMemRealloc(void *ptr, size_t mb);
|
310
310
|
VP_EXPORT void VpFree(Real *pv);
|
311
|
-
VP_EXPORT Real *VpAlloc(size_t mx, const char *szVal, int strict_p);
|
311
|
+
VP_EXPORT Real *VpAlloc(size_t mx, const char *szVal, int strict_p, int exc);
|
312
312
|
VP_EXPORT size_t VpAsgn(Real *c, Real *a, int isw);
|
313
313
|
VP_EXPORT size_t VpAddSub(Real *c,Real *a,Real *b,int operation);
|
314
314
|
VP_EXPORT size_t VpMult(Real *c,Real *a,Real *b);
|
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.4.0.pre.
|
4
|
+
version: 1.4.0.pre.20181204a
|
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: 2018-
|
13
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|