bigdecimal 1.4.0.pre.20181130a → 1.4.0.pre.20181204a
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 +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
|