@@ -2779,6 +2779,10 @@ tanh -0x2.6082fp-4
tanh 0xe.05031p-16
tanh 0x3.c80eaa7adaa3p-4
tanh 0x2.00f9857616524p-4
+tanh min
+tanh -min
+tanh min_subnorm
+tanh -min_subnorm
tgamma 0.5
tgamma -0.5
@@ -1988,12 +1988,16 @@ ldouble: 4
Function: "tanh_towardzero":
double: 1
float: 1
+idouble: 1
+ifloat: 1
ildouble: 3
ldouble: 3
Function: "tanh_upward":
double: 1
float: 1
+idouble: 1
+ifloat: 1
ildouble: 5
ldouble: 4
@@ -38,6 +38,7 @@ static char rcsid[] = "$NetBSD: s_tanh.c,v 1.7 1995/05/10 20:48:22 jtc Exp $";
* only tanh(0)=0 is exact for finite argument.
*/
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -68,7 +69,14 @@ __tanh (double x)
if ((ix | lx) == 0)
return x; /* x == +-0 */
if (ix < 0x3c800000) /* |x|<2**-55 */
- return x * (one + x); /* tanh(small) = small */
+ {
+ if (fabs (x) < DBL_MIN)
+ {
+ double force_underflow = x * x;
+ math_force_eval (force_underflow);
+ }
+ return x * (one + x); /* tanh(small) = small */
+ }
if (ix >= 0x3ff00000) /* |x|>=1 */
{
t = __expm1 (two * fabs (x));
@@ -17,6 +17,7 @@
static char rcsid[] = "$NetBSD: s_tanhf.c,v 1.4 1995/05/10 20:48:24 jtc Exp $";
#endif
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -41,7 +42,14 @@ float __tanhf(float x)
if (ix == 0)
return x; /* x == +-0 */
if (ix<0x24000000) /* |x|<2**-55 */
+ {
+ if (fabsf (x) < FLT_MIN)
+ {
+ float force_underflow = x * x;
+ math_force_eval (force_underflow);
+ }
return x*(one+x); /* tanh(small) = small */
+ }
if (ix>=0x3f800000) { /* |x|>=1 */
t = __expm1f(two*fabsf(x));
z = one - two/(t+two);
@@ -41,6 +41,7 @@
* only tanhl(0)=0 is exact for finite argument.
*/
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -73,7 +74,14 @@ __tanhl (long double x)
if (u.value == 0)
return x; /* x == +- 0 */
if (ix < 0x3fc60000) /* |x| < 2^-57 */
- return x * (one + tiny); /* tanh(small) = small */
+ {
+ if (fabsl (x) < LDBL_MIN)
+ {
+ long double force_underflow = x * x;
+ math_force_eval (force_underflow);
+ }
+ return x * (one + tiny); /* tanh(small) = small */
+ }
u.parts32.w0 = ix; /* Absolute value of x. */
if (ix >= 0x3fff0000)
{ /* |x| >= 1 */
@@ -38,6 +38,7 @@ static char rcsid[] = "$NetBSD: s_tanh.c,v 1.7 1995/05/10 20:48:22 jtc Exp $";
* only tanh(0)=0 is exact for finite argument.
*/
+#include <float.h>
#include <math.h>
#include <math_private.h>
#include <math_ldbl_opt.h>
@@ -66,7 +67,14 @@ long double __tanhl(long double x)
if (ix == 0)
return x; /* x == +-0 */
if (ix<0x3c60000000000000LL) /* |x|<2**-57 */
+ {
+ if (fabsl (x) < LDBL_MIN)
+ {
+ long double force_underflow = x * x;
+ math_force_eval (force_underflow);
+ }
return x*(one+x); /* tanh(small) = small */
+ }
if (ix>=0x3ff0000000000000LL) { /* |x|>=1 */
t = __expm1l(two*fabsl(x));
z = one - two/(t+two);
@@ -42,6 +42,7 @@ static char rcsid[] = "$NetBSD: $";
* only tanhl(0)=0 is exact for finite argument.
*/
+#include <float.h>
#include <math.h>
#include <math_private.h>
@@ -69,7 +70,14 @@ long double __tanhl(long double x)
if ((ix|j0|j1) == 0)
return x; /* x == +- 0 */
if (ix<0x3fc8) /* |x|<2**-55 */
+ {
+ if (fabsl (x) < LDBL_MIN)
+ {
+ long double force_underflow = x * x;
+ math_force_eval (force_underflow);
+ }
return x*(one+tiny); /* tanh(small) = small */
+ }
if (ix>=0x3fff) { /* |x|>=1 */
t = __expm1l(two*fabsl(x));
z = one - two/(t+two);