From 0a32cefabd2fb583a9141ef9c9553994a9fb4a4a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 4 Jul 2021 19:22:11 +0900 Subject: Add domain check macros --- math.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) (limited to 'math.c') diff --git a/math.c b/math.c index d099e254d9..f0237d4fa9 100644 --- a/math.c +++ b/math.c @@ -40,6 +40,10 @@ VALUE rb_eMathDomainError; #define domain_error(msg) \ rb_raise(rb_eMathDomainError, "Numerical argument is out of domain - " msg) +#define domain_check_min(val, min, msg) \ + ((val) < (min) ? domain_error(msg) : (void)0) +#define domain_check_range(val, min, max, msg) \ + ((val) < (min) || (max) < (val) ? domain_error(msg) : (void)0) /* * call-seq: @@ -184,8 +188,7 @@ math_acos(VALUE unused_obj, VALUE x) double d; d = Get_Double(x); - /* check for domain error */ - if (d < -1.0 || 1.0 < d) domain_error("acos"); + domain_check_range(d, -1.0, 1.0, "acos"); return DBL2NUM(acos(d)); } @@ -208,8 +211,7 @@ math_asin(VALUE unused_obj, VALUE x) double d; d = Get_Double(x); - /* check for domain error */ - if (d < -1.0 || 1.0 < d) domain_error("asin"); + domain_check_range(d, -1.0, 1.0, "asin"); return DBL2NUM(asin(d)); } @@ -343,8 +345,7 @@ math_acosh(VALUE unused_obj, VALUE x) double d; d = Get_Double(x); - /* check for domain error */ - if (d < 1.0) domain_error("acosh"); + domain_check_min(d, 1.0, "acosh"); return DBL2NUM(acosh(d)); } @@ -388,8 +389,7 @@ math_atanh(VALUE unused_obj, VALUE x) double d; d = Get_Double(x); - /* check for domain error */ - if (d < -1.0 || +1.0 < d) domain_error("atanh"); + domain_check_range(d, -1.0, +1.0, "atanh"); /* check for pole error */ if (d == -1.0) return DBL2NUM(-HUGE_VAL); if (d == +1.0) return DBL2NUM(+HUGE_VAL); @@ -501,8 +501,7 @@ math_log1(VALUE x) size_t numbits; double d = get_double_rshift(x, &numbits); - /* check for domain error */ - if (d < 0.0) domain_error("log"); + domain_check_min(d, 0.0, "log"); /* check for pole error */ if (d == 0.0) return -HUGE_VAL; @@ -544,8 +543,7 @@ math_log2(VALUE unused_obj, VALUE x) size_t numbits; double d = get_double_rshift(x, &numbits); - /* check for domain error */ - if (d < 0.0) domain_error("log2"); + domain_check_min(d, 0.0, "log2"); /* check for pole error */ if (d == 0.0) return DBL2NUM(-HUGE_VAL); @@ -574,8 +572,7 @@ math_log10(VALUE unused_obj, VALUE x) size_t numbits; double d = get_double_rshift(x, &numbits); - /* check for domain error */ - if (d < 0.0) domain_error("log10"); + domain_check_min(d, 0.0, "log10"); /* check for pole error */ if (d == 0.0) return DBL2NUM(-HUGE_VAL); @@ -656,8 +653,7 @@ rb_math_sqrt(VALUE x) return rb_complex_new(DBL2NUM(re), DBL2NUM(im)); } d = Get_Double(x); - /* check for domain error */ - if (d < 0.0) domain_error("sqrt"); + domain_check_min(d, 0.0, "sqrt"); if (d == 0.0) return DBL2NUM(0.0); return DBL2NUM(sqrt(d)); } @@ -886,7 +882,7 @@ math_gamma(VALUE unused_obj, VALUE x) return signbit(d) ? DBL2NUM(-HUGE_VAL) : DBL2NUM(HUGE_VAL); } if (d == floor(d)) { - if (d < 0.0) domain_error("gamma"); + domain_check_min(d, 0.0, "gamma"); if (1.0 <= d && d <= (double)NFACT_TABLE) { return DBL2NUM(fact_table[(int)d - 1]); } -- cgit v1.2.1