diff options
Diffstat (limited to 'math/w_scalbf.c')
-rw-r--r-- | math/w_scalbf.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/math/w_scalbf.c b/math/w_scalbf.c index 244fd1e91b..7ab0b8a4ac 100644 --- a/math/w_scalbf.c +++ b/math/w_scalbf.c @@ -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 (!__finitef (z) || z == 0.0f)) + { + if (__isnanf (z)) + { + if (!__isnanf (x) && !__isnanf (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) |