From 7b59234aaf296c63d389befe0ddd155999191316 Mon Sep 17 00:00:00 2001 From: naruse Date: Wed, 13 Jul 2016 05:29:30 +0000 Subject: * math.c (rb_math_sqrt): r55646 must use f_signbit. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55657 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- math.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'math.c') 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); -- cgit v1.2.3