mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 16:44:01 +02:00
[ruby/bigdecimal] Stop using GetVpValueWithPrec in rb_float_convert_to_BigDecimal
33e7c50263
d3c1b0b921
This commit is contained in:
parent
89f3125207
commit
fb18a8113a
1 changed files with 21 additions and 19 deletions
|
@ -199,6 +199,7 @@ cannot_be_coerced_into_BigDecimal(VALUE exc_class, VALUE v)
|
|||
}
|
||||
|
||||
static inline VALUE BigDecimal_div2(VALUE, VALUE, VALUE);
|
||||
static VALUE rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
|
||||
|
||||
static Real*
|
||||
GetVpValueWithPrec(VALUE v, long prec, int must)
|
||||
|
@ -208,27 +209,14 @@ GetVpValueWithPrec(VALUE v, long prec, int must)
|
|||
VALUE num, bg;
|
||||
char szD[128];
|
||||
VALUE orig = Qundef;
|
||||
double d;
|
||||
|
||||
again:
|
||||
switch(TYPE(v)) {
|
||||
case T_FLOAT:
|
||||
if (prec < 0) goto unable_to_coerce_without_prec;
|
||||
if (prec > (long)DBLE_FIG) goto SomeOneMayDoIt;
|
||||
d = RFLOAT_VALUE(v);
|
||||
if (!isfinite(d)) {
|
||||
pv = VpCreateRbObject(1, NULL, true);
|
||||
VpDtoV(pv, d);
|
||||
case T_FLOAT: {
|
||||
VALUE obj = rb_float_convert_to_BigDecimal(v, prec, must);
|
||||
TypedData_Get_Struct(obj, Real, &BigDecimal_data_type, pv);
|
||||
return pv;
|
||||
}
|
||||
if (d != 0.0) {
|
||||
v = rb_funcall(v, id_to_r, 0);
|
||||
goto again;
|
||||
}
|
||||
if (1/d < 0.0) {
|
||||
return VpCreateRbObject(prec, "-0", true);
|
||||
}
|
||||
return VpCreateRbObject(prec, "0", true);
|
||||
|
||||
case T_RATIONAL:
|
||||
if (prec < 0) goto unable_to_coerce_without_prec;
|
||||
|
@ -2806,10 +2794,13 @@ rb_inum_convert_to_BigDecimal(VALUE val, RB_UNUSED_VAR(size_t digs), int raise_e
|
|||
}
|
||||
}
|
||||
|
||||
static VALUE rb_rational_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception);
|
||||
|
||||
static VALUE
|
||||
rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
|
||||
{
|
||||
double d = RFLOAT_VALUE(val);
|
||||
|
||||
if (!isfinite(d)) {
|
||||
Real *vp = VpCreateRbObject(1, NULL, true); /* vp->obj is allocated */
|
||||
VpDtoV(vp, d);
|
||||
|
@ -2829,7 +2820,18 @@ rb_float_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
|
|||
rb_raise(rb_eArgError, "precision too large.");
|
||||
}
|
||||
|
||||
Real *vp = GetVpValueWithPrec(val, digs, 1);
|
||||
if (d != 0.0) {
|
||||
val = rb_funcall(val, id_to_r, 0);
|
||||
return rb_rational_convert_to_BigDecimal(val, digs, raise_exception);
|
||||
}
|
||||
|
||||
Real *vp;
|
||||
if (1/d < 0.0) {
|
||||
vp = VpCreateRbObject(digs, "-0", true);
|
||||
}
|
||||
else {
|
||||
vp = VpCreateRbObject(digs, "0", true);
|
||||
}
|
||||
return check_exception(vp->obj);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue