@@ -1812,6 +1812,11 @@ j1 0x1.ff00000000002p+840
j1 0x1p1023
j1 0x1p16382
j1 0x1p16383
+# Bug 18611: errno setting may be missing.
+j1 min missing-errno
+j1 -min missing-errno
+j1 min_subnorm missing-errno
+j1 -min_subnorm missing-errno
# jn (0, x) == j0 (x).
jn 0 -1.0
@@ -1836,6 +1841,11 @@ jn 1 1.5
jn 1 2.0
jn 1 8.0
jn 1 10.0
+# Bug 18611: errno setting may be missing.
+jn 1 min missing-errno
+jn 1 -min missing-errno
+jn 1 min_subnorm missing-errno
+jn 1 -min_subnorm missing-errno
jn 3 -1.0
jn 3 0.0
@@ -1867,6 +1877,12 @@ jn 2 0x1p127
jn 2 0x1p1023
jn 2 0x1p16383
+# Bug 18611: errno setting may be missing.
+jn 10 min missing-errno
+jn 10 -min missing-errno
+jn 10 min_subnorm missing-errno
+jn 10 -min_subnorm missing-errno
+
lgamma max
lgamma 1
lgamma 3
@@ -59,6 +59,7 @@
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -124,8 +125,16 @@ __ieee754_j1 (double x)
}
if (__glibc_unlikely (ix < 0x3e400000)) /* |x|<2**-27 */
{
- if (huge + x > one)
- return 0.5 * x; /* inexact if x!=0 necessary */
+ if (huge + x > one) /* inexact if x!=0 necessary */
+ {
+ double ret = 0.5 * x;
+ if (fabs (ret) < DBL_MIN)
+ {
+ double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
+ return ret;
+ }
}
z = x * x;
r1 = z * R[0]; z2 = z * z;
@@ -246,6 +246,11 @@ __ieee754_jn (int n, double x)
}
if (ret == 0)
ret = __copysign (DBL_MIN, ret) * DBL_MIN;
+ else if (fabs (ret) < DBL_MIN)
+ {
+ double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
return ret;
}
strong_alias (__ieee754_jn, __jn_finite)
@@ -14,6 +14,7 @@
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -69,7 +70,14 @@ __ieee754_j1f(float x)
else return z;
}
if(__builtin_expect(ix<0x32000000, 0)) { /* |x|<2**-27 */
- if(huge+x>one) return (float)0.5*x;/* inexact if x!=0 necessary */
+ if(huge+x>one) { /* inexact if x!=0 necessary */
+ float ret = (float) 0.5 * x;
+ if (fabsf (ret) < FLT_MIN) {
+ float force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
+ return ret;
+ }
}
z = x*x;
r = z*(r00+z*(r01+z*(r02+z*r03)));
@@ -170,6 +170,10 @@ __ieee754_jnf(int n, float x)
}
if (ret == 0)
ret = __copysignf (FLT_MIN, ret) * FLT_MIN;
+ else if (fabsf (ret) < FLT_MIN) {
+ float force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
return ret;
}
strong_alias (__ieee754_jnf, __jnf_finite)
@@ -297,6 +297,11 @@ __ieee754_jnl (int n, long double x)
}
if (ret == 0)
ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
+ else if (fabsl (ret) < LDBL_MIN)
+ {
+ long double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
return ret;
}
strong_alias (__ieee754_jnl, __jnl_finite)
@@ -297,6 +297,11 @@ __ieee754_jnl (int n, long double x)
}
if (ret == 0)
ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
+ else if (fabsl (ret) < LDBL_MIN)
+ {
+ long double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
return ret;
}
strong_alias (__ieee754_jnl, __jnl_finite)
@@ -72,6 +72,7 @@
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -150,8 +151,16 @@ __ieee754_j1l (long double x)
}
if (__glibc_unlikely (ix < 0x3fde)) /* |x| < 2^-33 */
{
- if (huge + x > one)
- return 0.5 * x; /* inexact if x!=0 necessary */
+ if (huge + x > one) /* inexact if x!=0 necessary */
+ {
+ long double ret = 0.5 * x;
+ if (fabsl (ret) < LDBL_MIN)
+ {
+ long double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
+ return ret;
+ }
}
z = x * x;
r = z * (R[0] + z * (R[1]+ z * (R[2] + z * (R[3] + z * R[4]))));
@@ -290,6 +290,11 @@ __ieee754_jnl (int n, long double x)
}
if (ret == 0)
ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
+ else if (fabsl (ret) < LDBL_MIN)
+ {
+ long double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
return ret;
}
strong_alias (__ieee754_jnl, __jnl_finite)