about summary refs log tree commit diff
path: root/math/w_scalbl.c
diff options
context:
space:
mode:
Diffstat (limited to 'math/w_scalbl.c')
-rw-r--r--math/w_scalbl.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/math/w_scalbl.c b/math/w_scalbl.c
index cffaa67cc7..40cc68e865 100644
--- a/math/w_scalbl.c
+++ b/math/w_scalbl.c
@@ -45,8 +45,32 @@ sysv_scalbl (long double x, long double fn)
 long double
 __scalbl (long double x, long double fn)
 {
-  return (__builtin_expect (_LIB_VERSION == _SVID_, 0)
-	  ? sysv_scalbl (x, fn)
-	  : __ieee754_scalbl (x, fn));
+  if (__glibc_unlikely (_LIB_VERSION == _SVID_))
+    return sysv_scalbl (x, fn);
+  else
+    {
+      long double z = __ieee754_scalbl (x, fn);
+
+      if (__glibc_unlikely (!__finitel (z) || z == 0.0L))
+	{
+	  if (__isnanl (z))
+	    {
+	      if (!__isnanl (x) && !__isnanl (fn))
+		__set_errno (EDOM);
+	    }
+	  else if (__isinf_nsl (z))
+	    {
+	      if (!__isinf_nsl (x) && !__isinf_nsl (fn))
+		__set_errno (ERANGE);
+	    }
+	  else
+	    {
+	      /* z == 0.  */
+	      if (x != 0.0L && !__isinf_nsl (fn))
+		__set_errno (ERANGE);
+	    }
+	}
+      return z;
+    }
 }
 weak_alias (__scalbl, scalbl)