diff --git a/ChangeLog b/ChangeLog index 0ce0521314..2adbd80de8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed Jul 13 14:28:33 2016 NARUSE, Yui + + * math.c (rb_math_sqrt): r55646 must use f_signbit. + Wed Jul 13 14:22:50 2016 Koichi Sasada * iseq.c (Init_ISeq): undef ISeq.translate and ISeq.load_iseq diff --git a/math.c b/math.c index 8d36389a28..9cdf9e5565 100644 --- a/math.c +++ b/math.c @@ -591,13 +591,31 @@ math_sqrt(VALUE obj, VALUE x) return rb_math_sqrt(x); } +#define f_boolcast(x) ((x) ? Qtrue : Qfalse) +inline static VALUE +f_negative_p(VALUE x) +{ + if (FIXNUM_P(x)) + return f_boolcast(FIX2LONG(x) < 0); + return rb_funcall(x, '<', 1, INT2FIX(0)); +} +inline static VALUE +f_signbit(VALUE x) +{ + if (RB_TYPE_P(x, T_FLOAT)) { + double f = RFLOAT_VALUE(x); + return f_boolcast(!isnan(f) && signbit(f)); + } + return f_negative_p(x); +} + VALUE rb_math_sqrt(VALUE x) { double d; if (RB_TYPE_P(x, T_COMPLEX)) { - int neg = signbit(RCOMPLEX(x)->imag); + int neg = f_signbit(RCOMPLEX(x)->imag); double re = Get_Double(RCOMPLEX(x)->real), im; d = Get_Double(rb_complex_abs(x)); im = sqrt((d - re) / 2.0);