diff options
Diffstat (limited to 'math/w_scalbf.c')
-rw-r--r-- | math/w_scalbf.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/math/w_scalbf.c b/math/w_scalbf.c index c23e35ba34..e7b855b6d1 100644 --- a/math/w_scalbf.c +++ b/math/w_scalbf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2011-2014 Free Software Foundation, Inc. +/* Copyright (C) 2011-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gmail.com>, 2011. @@ -27,9 +27,9 @@ sysv_scalbf (float x, float fn) { float z = __ieee754_scalbf (x, fn); - if (__builtin_expect (__isinff (z), 0)) + if (__glibc_unlikely (isinf (z))) { - if (__finitef (x)) + if (isfinite (x)) return __kernel_standard_f (x, fn, 132); /* scalb overflow */ else __set_errno (ERANGE); @@ -45,8 +45,32 @@ sysv_scalbf (float x, float fn) float __scalbf (float x, float fn) { - return (__builtin_expect (_LIB_VERSION == _SVID_, 0) - ? sysv_scalbf (x, fn) - : __ieee754_scalbf (x, fn)); + if (__glibc_unlikely (_LIB_VERSION == _SVID_)) + return sysv_scalbf (x, fn); + else + { + float z = __ieee754_scalbf (x, fn); + + if (__glibc_unlikely (!isfinite (z) || z == 0.0f)) + { + if (isnan (z)) + { + if (!isnan (x) && !isnan (fn)) + __set_errno (EDOM); + } + else if (__isinf_nsf (z)) + { + if (!__isinf_nsf (x) && !__isinf_nsf (fn)) + __set_errno (ERANGE); + } + else + { + /* z == 0. */ + if (x != 0.0f && !__isinf_nsf (fn)) + __set_errno (ERANGE); + } + } + return z; + } } weak_alias (__scalbf, scalbf) |