summaryrefslogtreecommitdiff
path: root/math/w_scalbf.c
diff options
context:
space:
mode:
Diffstat (limited to 'math/w_scalbf.c')
-rw-r--r--math/w_scalbf.c36
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)