bigdecimal 4.1.0 → 4.1.2
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/ext/bigdecimal/bigdecimal.c +180 -237
- data/ext/bigdecimal/bigdecimal.h +6 -1
- data/ext/bigdecimal/div.h +13 -13
- data/ext/bigdecimal/extconf.rb +4 -0
- data/ext/bigdecimal/missing/dtoa.c +184 -137
- data/ext/bigdecimal/ntt.h +5 -5
- data/lib/bigdecimal/math.rb +1 -1
- data/lib/bigdecimal.rb +18 -1
- metadata +1 -1
data/ext/bigdecimal/bigdecimal.h
CHANGED
|
@@ -168,6 +168,11 @@ typedef struct {
|
|
|
168
168
|
Real *real;
|
|
169
169
|
} BDVALUE;
|
|
170
170
|
|
|
171
|
+
typedef struct {
|
|
172
|
+
VALUE bigdecimal_or_nil;
|
|
173
|
+
Real *real_or_null;
|
|
174
|
+
} NULLABLE_BDVALUE;
|
|
175
|
+
|
|
171
176
|
/*
|
|
172
177
|
* ------------------
|
|
173
178
|
* EXPORTables.
|
|
@@ -194,7 +199,7 @@ VP_EXPORT unsigned short VpSetRoundMode(unsigned short n);
|
|
|
194
199
|
VP_EXPORT int VpException(unsigned short f,const char *str,int always);
|
|
195
200
|
VP_EXPORT size_t VpNumOfChars(Real *vp,const char *pszFmt);
|
|
196
201
|
VP_EXPORT size_t VpInit(DECDIG BaseVal);
|
|
197
|
-
VP_EXPORT
|
|
202
|
+
VP_EXPORT NULLABLE_BDVALUE VpAlloc(const char *szVal, int strict_p, int exc);
|
|
198
203
|
VP_EXPORT size_t VpAsgn(Real *c, Real *a, int isw);
|
|
199
204
|
VP_EXPORT size_t VpAddSub(Real *c,Real *a,Real *b,int operation);
|
|
200
205
|
VP_EXPORT size_t VpMult(Real *c,Real *a,Real *b);
|
data/ext/bigdecimal/div.h
CHANGED
|
@@ -59,14 +59,14 @@ divmod_by_inv_mul(VALUE x, VALUE y, VALUE inv, VALUE *res_div, VALUE *res_mod) {
|
|
|
59
59
|
|
|
60
60
|
static void
|
|
61
61
|
slice_copy(DECDIG *dest, Real *src, size_t rshift, size_t length) {
|
|
62
|
-
ssize_t start = src->exponent - rshift - length;
|
|
62
|
+
ssize_t start = src->exponent - (ssize_t)rshift - (ssize_t)length;
|
|
63
63
|
if (start >= (ssize_t)src->Prec) return;
|
|
64
64
|
if (start < 0) {
|
|
65
65
|
dest -= start;
|
|
66
|
-
length
|
|
66
|
+
length -= (size_t)(-start);
|
|
67
67
|
start = 0;
|
|
68
68
|
}
|
|
69
|
-
size_t max_length = src->Prec - start;
|
|
69
|
+
size_t max_length = (size_t)((ssize_t)src->Prec - start);
|
|
70
70
|
memcpy(dest, src->frac + start, Min(length, max_length) * sizeof(DECDIG));
|
|
71
71
|
}
|
|
72
72
|
|
|
@@ -101,28 +101,28 @@ divmod_newton(VALUE x, VALUE y, VALUE *div_out, VALUE *mod_out) {
|
|
|
101
101
|
BDVALUE div_result = NewZeroWrap(1, BIGDECIMAL_COMPONENT_FIGURES * (num_blocks * block_figs + 1));
|
|
102
102
|
BDVALUE bdx = GetBDValueMust(x);
|
|
103
103
|
|
|
104
|
-
VALUE mod = BigDecimal_fix(BigDecimal_decimal_shift(x, SSIZET2NUM(-num_blocks * block_digits)));
|
|
105
|
-
for (ssize_t i = num_blocks - 1; i >= 0; i--) {
|
|
104
|
+
VALUE mod = BigDecimal_fix(BigDecimal_decimal_shift(x, SSIZET2NUM(-(ssize_t)(num_blocks * block_digits))));
|
|
105
|
+
for (ssize_t i = (ssize_t)(num_blocks - 1); i >= 0; i--) {
|
|
106
106
|
memset(divident.real->frac, 0, (y_figs + block_figs) * sizeof(DECDIG));
|
|
107
107
|
|
|
108
108
|
BDVALUE bdmod = GetBDValueMust(mod);
|
|
109
109
|
slice_copy(divident.real->frac, bdmod.real, 0, y_figs);
|
|
110
|
-
slice_copy(divident.real->frac + y_figs, bdx.real, i * block_figs, block_figs);
|
|
110
|
+
slice_copy(divident.real->frac + y_figs, bdx.real, (size_t)i * block_figs, block_figs);
|
|
111
111
|
RB_GC_GUARD(bdmod.bigdecimal);
|
|
112
112
|
|
|
113
113
|
VpSetSign(divident.real, 1);
|
|
114
|
-
divident.real->exponent = y_figs + block_figs;
|
|
114
|
+
divident.real->exponent = (ssize_t)(y_figs + block_figs);
|
|
115
115
|
divident.real->Prec = y_figs + block_figs;
|
|
116
116
|
VpNmlz(divident.real);
|
|
117
117
|
|
|
118
118
|
VALUE div;
|
|
119
119
|
divmod_by_inv_mul(divident.bigdecimal, y, yinv, &div, &mod);
|
|
120
120
|
BDVALUE bddiv = GetBDValueMust(div);
|
|
121
|
-
slice_copy(div_result.real->frac + (num_blocks - i - 1) * block_figs, bddiv.real, 0, block_figs + 1);
|
|
121
|
+
slice_copy(div_result.real->frac + (num_blocks - (size_t)i - 1) * block_figs, bddiv.real, 0, block_figs + 1);
|
|
122
122
|
RB_GC_GUARD(bddiv.bigdecimal);
|
|
123
123
|
}
|
|
124
124
|
VpSetSign(div_result.real, 1);
|
|
125
|
-
div_result.real->exponent = num_blocks * block_figs + 1;
|
|
125
|
+
div_result.real->exponent = (ssize_t)(num_blocks * block_figs + 1);
|
|
126
126
|
div_result.real->Prec = num_blocks * block_figs + 1;
|
|
127
127
|
VpNmlz(div_result.real);
|
|
128
128
|
RB_GC_GUARD(bdx.bigdecimal);
|
|
@@ -148,8 +148,8 @@ VpDivdNewtonInner(VALUE args_ptr)
|
|
|
148
148
|
VpAsgn(b2.real, b, 1);
|
|
149
149
|
VpSetSign(a2.real, 1);
|
|
150
150
|
VpSetSign(b2.real, 1);
|
|
151
|
-
a2.real->exponent = base_prec + div_prec;
|
|
152
|
-
b2.real->exponent = base_prec;
|
|
151
|
+
a2.real->exponent = (ssize_t)(base_prec + div_prec);
|
|
152
|
+
b2.real->exponent = (ssize_t)base_prec;
|
|
153
153
|
|
|
154
154
|
if ((ssize_t)a2.real->Prec > a2.real->exponent) {
|
|
155
155
|
a2_frac = BigDecimal_frac(a2.bigdecimal);
|
|
@@ -164,9 +164,9 @@ VpDivdNewtonInner(VALUE args_ptr)
|
|
|
164
164
|
VpAsgn(r, r2.real, VpGetSign(a));
|
|
165
165
|
AddExponent(c, a->exponent);
|
|
166
166
|
AddExponent(c, -b->exponent);
|
|
167
|
-
AddExponent(c, -div_prec);
|
|
167
|
+
AddExponent(c, -(ssize_t)div_prec);
|
|
168
168
|
AddExponent(r, a->exponent);
|
|
169
|
-
AddExponent(r, -base_prec
|
|
169
|
+
AddExponent(r, -(ssize_t)(base_prec + div_prec));
|
|
170
170
|
RB_GC_GUARD(a2.bigdecimal);
|
|
171
171
|
RB_GC_GUARD(a2.bigdecimal);
|
|
172
172
|
RB_GC_GUARD(c2.bigdecimal);
|
data/ext/bigdecimal/extconf.rb
CHANGED
|
@@ -46,6 +46,10 @@ have_func("rb_opts_exception_p", "ruby.h")
|
|
|
46
46
|
have_func("rb_category_warn", "ruby.h")
|
|
47
47
|
have_const("RB_WARN_CATEGORY_DEPRECATED", "ruby.h")
|
|
48
48
|
|
|
49
|
+
if RUBY_ENGINE == "ruby"
|
|
50
|
+
have_const("RUBY_TYPED_EMBEDDABLE", "ruby.h") # RUBY_VERSION >= 3.3
|
|
51
|
+
end
|
|
52
|
+
|
|
49
53
|
if File.file?(File.expand_path('../lib/bigdecimal.rb', __FILE__))
|
|
50
54
|
bigdecimal_rb = "$(srcdir)/lib/bigdecimal.rb"
|
|
51
55
|
else
|