summaryrefslogtreecommitdiff
path: root/sysdeps/libm-ieee754
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/libm-ieee754')
-rw-r--r--sysdeps/libm-ieee754/e_atan2l.c2
-rw-r--r--sysdeps/libm-ieee754/s_asinhl.c2
-rw-r--r--sysdeps/libm-ieee754/s_cexpf.c63
-rw-r--r--sysdeps/libm-ieee754/s_cexpl.c63
-rw-r--r--sysdeps/libm-ieee754/s_finitel.c2
-rw-r--r--sysdeps/libm-ieee754/s_fpclassifyl.c12
-rw-r--r--sysdeps/libm-ieee754/s_nan.c3
-rw-r--r--sysdeps/libm-ieee754/s_nanf.c3
-rw-r--r--sysdeps/libm-ieee754/s_nanl.c3
9 files changed, 141 insertions, 12 deletions
diff --git a/sysdeps/libm-ieee754/e_atan2l.c b/sysdeps/libm-ieee754/e_atan2l.c
index 6b76f96533..e60f2d41c1 100644
--- a/sysdeps/libm-ieee754/e_atan2l.c
+++ b/sysdeps/libm-ieee754/e_atan2l.c
@@ -126,7 +126,7 @@ pi_lo = -5.01655761266833202345176e-20L;/* 0xBFBE, 0xECE675D1, 0xFC8F8CBB */
case 1: {
u_int32_t sz;
GET_LDOUBLE_EXP(sz,z);
- SET_LDOUBLE_EXP(z,sy ^ 0x8000);
+ SET_LDOUBLE_EXP(z,sz ^ 0x8000);
}
return z ; /* atan(-,+) */
case 2: return pi-(z-pi_lo);/* atan(+,-) */
diff --git a/sysdeps/libm-ieee754/s_asinhl.c b/sysdeps/libm-ieee754/s_asinhl.c
index 865bc31052..d5b307753e 100644
--- a/sysdeps/libm-ieee754/s_asinhl.c
+++ b/sysdeps/libm-ieee754/s_asinhl.c
@@ -65,6 +65,6 @@ huge= 1.000000000000000000e+4900L;
t = x*x;
w =__log1pl(fabsl(x)+t/(one+__ieee754_sqrtl(one+t)));
}
- if(hx>0x7fff) return w; else return -w;
+ if(hx>0x8000) return -w; else return w;
}
weak_alias (__asinhl, asinhl)
diff --git a/sysdeps/libm-ieee754/s_cexpf.c b/sysdeps/libm-ieee754/s_cexpf.c
new file mode 100644
index 0000000000..14cfb19766
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_cexpf.c
@@ -0,0 +1,63 @@
+/* Return value of complex exponential function for float complex value.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ float
+__cexpf (__complex__ float x)
+{
+ __complex__ float retval;
+
+ if (isfinite (__real__ x))
+ {
+ if (isfinite (__imag__ x))
+ {
+ retval = __expf (__real__ x) * (__cosf (__imag__ x)
+ + 1i * __sinf (__imag__ x));
+ }
+ else
+ /* If the imaginary part is +-inf or NaN and the real part is
+ not +-inf the result is NaN + iNan. */
+ retval = __nanf ("") + 1.0i * __nanf ("");
+ }
+ else if (__isinff (__real__ x))
+ {
+ if (isfinite (__imag__ x))
+ {
+ if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
+ retval = HUGE_VALF;
+ else
+ retval = ((signbit (__real__ x) ? 0.0 : HUGE_VALF)
+ * (__cosf (__imag__ x) + 1i * __sinf (__imag__ x)));
+ }
+ else if (signbit (__real__ x))
+ retval = HUGE_VALF + 1.0i * __nanf ("");
+ else
+ retval = 0.0;
+ }
+ else
+ /* If the real part is NaN the result is NaN + iNan. */
+ retval = __nanf ("") + 1.0i * __nanf ("");
+
+ return retval;
+}
+weak_alias (__cexpf, cexpf)
diff --git a/sysdeps/libm-ieee754/s_cexpl.c b/sysdeps/libm-ieee754/s_cexpl.c
new file mode 100644
index 0000000000..6b3d409158
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_cexpl.c
@@ -0,0 +1,63 @@
+/* Return value of complex exponential function for long double complex value.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <complex.h>
+#include <math.h>
+
+
+__complex__ long double
+__cexpl (__complex__ long double x)
+{
+ __complex__ long double retval;
+
+ if (isfinite (__real__ x))
+ {
+ if (isfinite (__imag__ x))
+ {
+ retval = __expl (__real__ x) * (__cosl (__imag__ x)
+ + 1i * __sinl (__imag__ x));
+ }
+ else
+ /* If the imaginary part is +-inf or NaN and the real part is
+ not +-inf the result is NaN + iNan. */
+ retval = __nanl ("") + 1.0i * __nanl ("");
+ }
+ else if (__isinfl (__real__ x))
+ {
+ if (isfinite (__imag x))
+ {
+ if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
+ retval = HUGE_VALL;
+ else
+ retval = ((signbit (__real__ x) ? 0.0 : HUGE_VALL)
+ * (__cosl (__imag__ x) + 1i * __sinl (__imag__ x)));
+ }
+ else if (signbit (__real__ x))
+ retval = HUGE_VALL + 1.0i * __nanl ("");
+ else
+ retval = 0.0;
+ }
+ else
+ /* If the real part is NaN the result is NaN + iNan. */
+ retval = __nanl ("") + 1.0i * __nanl ("");
+
+ return retval;
+}
+weak_alias (__cexpl, cexpl)
diff --git a/sysdeps/libm-ieee754/s_finitel.c b/sysdeps/libm-ieee754/s_finitel.c
index 4423726645..6e444e90d0 100644
--- a/sysdeps/libm-ieee754/s_finitel.c
+++ b/sysdeps/libm-ieee754/s_finitel.c
@@ -35,6 +35,6 @@ static char rcsid[] = "$NetBSD: $";
{
int32_t exp;
GET_LDOUBLE_EXP(exp,x);
- return (int)((u_int32_t)((exp&0x7fff)-0x7fff)>>15);
+ return (int)((u_int32_t)((exp&0x7fff)-0x7fff)>>31);
}
weak_alias (__finitel, finitel)
diff --git a/sysdeps/libm-ieee754/s_fpclassifyl.c b/sysdeps/libm-ieee754/s_fpclassifyl.c
index d7a0e943cf..4df0b44f75 100644
--- a/sysdeps/libm-ieee754/s_fpclassifyl.c
+++ b/sysdeps/libm-ieee754/s_fpclassifyl.c
@@ -2,6 +2,7 @@
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ Fixed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@@ -26,19 +27,18 @@
int
__fpclassifyl (long double x)
{
- u_int32_t ex, hx, lx;
+ u_int32_t ex, hx, lx, m;
int retval = FP_NORMAL;
GET_LDOUBLE_WORDS (ex, hx, lx, x);
- hx &= 0x7fffffff;
- hx |= lx;
+ m = (hx & 0x7fffffff) | lx;
ex &= 0x7fff;
- if ((ex | hx) == 0)
+ if ((ex | m) == 0)
retval = FP_ZERO;
- else if (ex == 0)
+ else if (ex == 0 && (hx & 0x80000000) == 0)
retval = FP_SUBNORMAL;
else if (ex == 0x7fff)
- retval = hx != 0 ? FP_NAN : FP_INFINITE;
+ retval = m != 0 ? FP_NAN : FP_INFINITE;
return retval;
}
diff --git a/sysdeps/libm-ieee754/s_nan.c b/sysdeps/libm-ieee754/s_nan.c
index 58551c1ad5..0d065d5c72 100644
--- a/sysdeps/libm-ieee754/s_nan.c
+++ b/sysdeps/libm-ieee754/s_nan.c
@@ -31,7 +31,7 @@
double
-nan (const char *tagp)
+__nan (const char *tagp)
{
#ifdef HANDLE_TAGP
/* If we ever should have use of the TAGP parameter we will use the
@@ -45,3 +45,4 @@ nan (const char *tagp)
return nan_value.d;
#endif
}
+weak_alias (__nan, nan)
diff --git a/sysdeps/libm-ieee754/s_nanf.c b/sysdeps/libm-ieee754/s_nanf.c
index e965b94b33..660f30daf3 100644
--- a/sysdeps/libm-ieee754/s_nanf.c
+++ b/sysdeps/libm-ieee754/s_nanf.c
@@ -31,7 +31,7 @@
float
-nanf (const char *tagp)
+__nanf (const char *tagp)
{
#ifdef HANDLE_TAGP
/* If we ever should have use of the TAGP parameter we will use the
@@ -45,3 +45,4 @@ nanf (const char *tagp)
return nan_value.f;
#endif
}
+weak_alias (__nanf, nanf)
diff --git a/sysdeps/libm-ieee754/s_nanl.c b/sysdeps/libm-ieee754/s_nanl.c
index df0180ee46..4ade80424f 100644
--- a/sysdeps/libm-ieee754/s_nanl.c
+++ b/sysdeps/libm-ieee754/s_nanl.c
@@ -31,7 +31,7 @@
long double
-nanl (const char *tagp)
+__nanl (const char *tagp)
{
#ifdef HANDLE_TAGP
/* If we ever should have use of the TAGP parameter we will use the
@@ -46,3 +46,4 @@ nanl (const char *tagp)
return nan_value.d;
#endif
}
+weak_alias (__nanl, nanl)