From 21f5f472875cff6f0b2d1e106876fe6ad36cc55c Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 27 Jul 2006 15:26:14 +0000 Subject: * math.c (domain_check): a new function to check domain error explicitly for systems that return NaN like FreeBSD. [ruby-core:07019] * math.c (math_acos, math_asin, math_acosh, math_atanh, math_log, math_log10, math_sqrt): use domain_check(). * math.c (math_sqrt): fix documentation flaw. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10626 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- math.c | 56 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) (limited to 'math.c') diff --git a/math.c b/math.c index 4cdcbc7471..259d4c91df 100644 --- a/math.c +++ b/math.c @@ -22,6 +22,27 @@ VALUE rb_mMath; Need_Float(y);\ } while (0) +static void +domain_check(x, msg) + double x; + char *msg; +{ + while(1) { + if (errno) { + rb_sys_fail(msg); + } + if (isnan(x)) { +#if defined(EDOM) + errno = EDOM; +#elif define(ERANGE) + errno = ERANGE; +#endif + continue; + } + break; + } +} + /* * call-seq: @@ -40,7 +61,6 @@ math_atan2(VALUE obj, VALUE y, VALUE x) } - /* * call-seq: * Math.cos(x) => float @@ -103,9 +123,7 @@ math_acos(VALUE obj, VALUE x) Need_Float(x); errno = 0; d = acos(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("acos"); - } + domain_check(d, "acos"); return rb_float_new(d); } @@ -124,9 +142,7 @@ math_asin(VALUE obj, VALUE x) Need_Float(x); errno = 0; d = asin(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("asin"); - } + domain_check(d, "asin"); return rb_float_new(d); } @@ -228,9 +244,7 @@ math_acosh(VALUE obj, VALUE x) Need_Float(x); errno = 0; d = acosh(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("acosh"); - } + domain_check(d, "acosh"); return rb_float_new(d); } @@ -263,9 +277,7 @@ math_atanh(VALUE obj, VALUE x) Need_Float(x); errno = 0; d = atanh(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("atanh"); - } + domain_check(d, "atanh"); return rb_float_new(d); } @@ -309,16 +321,11 @@ math_log(int argc, VALUE *argv) Need_Float(x); errno = 0; d = log(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("log"); - } if (!NIL_P(base)) { Need_Float(base); d /= log(RFLOAT(base)->value); } - if (errno) { - rb_sys_fail("log"); - } + domain_check(d); return rb_float_new(d); } @@ -370,9 +377,7 @@ math_log10(VALUE obj, VALUE x) Need_Float(x); errno = 0; d = log10(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("log10"); - } + domain_check(d, "log10"); return rb_float_new(d); } @@ -380,8 +385,7 @@ math_log10(VALUE obj, VALUE x) * call-seq: * Math.sqrt(numeric) => float * - * Returns the non-negative square root of numeric. Raises - * ArgError if numeric is less than zero. + * Returns the non-negative square root of numeric. */ static VALUE @@ -392,9 +396,7 @@ math_sqrt(VALUE obj, VALUE x) Need_Float(x); errno = 0; d = sqrt(RFLOAT(x)->value); - if (errno) { - rb_sys_fail("sqrt"); - } + domain_check(d, "sqrt"); return rb_float_new(d); } -- cgit v1.2.3