aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog64
-rw-r--r--linuxthreads/ChangeLog11
-rw-r--r--linuxthreads/pthread.c61
-rw-r--r--linuxthreads/signals.c12
-rw-r--r--math/libm-test.inc66
-rw-r--r--math/math.h40
-rw-r--r--sysdeps/i386/fpu/bits/mathinline.h19
-rw-r--r--sysdeps/i386/fpu/e_atanh.S15
-rw-r--r--sysdeps/i386/fpu/e_atanhf.S11
-rw-r--r--sysdeps/i386/fpu/e_atanhl.S16
-rw-r--r--sysdeps/i386/fpu/e_log10.S11
-rw-r--r--sysdeps/i386/fpu/e_log10f.S11
-rw-r--r--sysdeps/i386/fpu/e_log10l.S11
-rw-r--r--sysdeps/i386/fpu/libm-test-ulps1428
-rw-r--r--sysdeps/i386/fpu/s_log1p.S11
-rw-r--r--sysdeps/i386/fpu/s_log1pf.S11
-rw-r--r--sysdeps/i386/fpu/s_log1pl.S10
-rw-r--r--sysdeps/i386/fpu/s_log2.S11
-rw-r--r--sysdeps/i386/fpu/s_log2f.S11
-rw-r--r--sysdeps/i386/fpu/s_log2l.S11
20 files changed, 1770 insertions, 71 deletions
diff --git a/ChangeLog b/ChangeLog
index 030c336076..a750df33dc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,67 @@
+1999-10-24 Ulrich Drepper <drepper@cygnus.com>
+
+ * math/libm-test.inc: Disable some boundary case tests for inline
+ function testing.
+
+ * math/math.h: Pretty printing.
+
+ * sysdeps/i386/fpu/e_atanh.S: Correct handling of NaN.
+ * sysdeps/i386/fpu/e_atanhf.S: Likewise.
+ * sysdeps/i386/fpu/e_atanhl.S: Likewise.
+ * sysdeps/i386/fpu/e_log10.S: Likewise.
+ * sysdeps/i386/fpu/e_log10f.S: Likewise.
+ * sysdeps/i386/fpu/e_log10l.S: Likewise.
+ * sysdeps/i386/fpu/s_log1p.S: Likewise.
+ * sysdeps/i386/fpu/s_log1pf.S: Likewise.
+ * sysdeps/i386/fpu/s_log1pl.S: Likewise.
+ * sysdeps/i386/fpu/s_log2.S: Likewise.
+ * sysdeps/i386/fpu/s_log2f.S: Likewise.
+ * sysdeps/i386/fpu/s_log2l.S: Likewise.
+
+ * sysdeps/i386/fpu/libm-test-ulps: New file.
+
+ * sysdeps/i386/fpu/bits/mathinline.h (__expm1_code): Correct return
+ value for x == 0.
+ (pow): Correct case x == 0.
+ (__sgn1l): Correct handling of -0.0.
+
+1999-10-22 Andreas Jaeger <aj@suse.de>
+
+ * math/libm-test.inc (asinh_test): Add test for NaN as input parameter.
+ (atan_test): Likewise.
+ (atanh_test): Likewise.
+ (atan2_test): Likewise.
+ (carg_test): Likewise.
+ (ceil_test): Likewise.
+ (cos_test): Likewise.
+ (cosh_test): Likewise.
+ (cpow_test): Likewise.
+ (erf_test): Likewise.
+ (erfc_test): Likewise.
+ (exp_test): Likewise.
+ (exp10_test): Likewise.
+ (exp2_test): Likewise.
+ (expm1_test): Likewise.
+ (fabs_test): Likewise.
+ (floor_test): Likewise.
+ (fmod_test): Likewise.
+ (gamma_test): Likewise.
+ (lgamma_test): Likewise.
+ (log10_test): Likewise.
+ (log1p_test): Likewise.
+ (log2_test): Likewise.
+ (logb_test): Likewise.
+ (nearbyint_test): Likewise.
+ (remainder_test): Likewise.
+ (remquo_test): Likewise.
+ (sin_test): Likewise.
+ (sincos_test): Likewise.
+ (sinh_test): Likewise.
+ (sqrt_test): Likewise.
+ (tan_test): Likewise.
+ (tanh_test): Likewise.
+ (tgamma_test): Likewise.
+
1999-10-21 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/ieee754/ldbl-96/s_nexttoward.c: If x == y, return y.
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index b4a8cea5e0..d56f84f0ac 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,14 @@
+1999-10-21 Xavier Leroy <Xavier.Leroy@inria.fr>
+
+ * linuxthreads/pthread.c: For i386, wrap pthread_handle_sigrestart
+ and pthread_handle_sigcancel with functions that restore
+ %gs from the signal context. For each signal handling function,
+ two wrappers are required, one for a non-RT signal and one for
+ a RT signal.
+ * linuxthreads/signal.c: For i386, add code to restore %gs
+ from the signal context in pthread_sighandler and
+ pthread_sighandler_rt.
+
1999-10-17 Ulrich Drepper <drepper@cygnus.com>
* internals.h (PTHREAD_START_ARGS_INITIALIZER): Add cast.
diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c
index 2741b211b6..5296c1e349 100644
--- a/linuxthreads/pthread.c
+++ b/linuxthreads/pthread.c
@@ -162,14 +162,15 @@ extern int _h_errno;
/* Forward declarations */
static void pthread_exit_process(int retcode, void *arg);
-#ifndef __i386__
static void pthread_handle_sigcancel(int sig);
static void pthread_handle_sigrestart(int sig);
-#else
-static void pthread_handle_sigcancel(int sig, struct sigcontext ctx);
-static void pthread_handle_sigrestart(int sig, struct sigcontext ctx);
+#ifdef __i386__
+static void pthread_handle_sigrestart_nonrt(int sig, struct sigcontext ctx);
static void pthread_handle_sigrestart_rt(int sig, struct siginfo *si,
struct ucontext *uc);
+static void pthread_handle_sigcancel_nonrt(int sig, struct sigcontext ctx);
+static void pthread_handle_sigcancel_rt(int sig, struct siginfo *si,
+ struct ucontext *uc);
#endif
static void pthread_handle_sigdebug(int sig);
@@ -330,7 +331,7 @@ static void pthread_initialize(void)
if (__pthread_sig_restart >= SIGRTMIN)
sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart_rt;
else
- sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart;
+ sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart_nonrt;
#endif
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
@@ -338,7 +339,10 @@ static void pthread_initialize(void)
#ifndef __i386__
sa.sa_handler = pthread_handle_sigcancel;
#else
- sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel;
+ if (__pthread_sig_restart >= SIGRTMIN)
+ sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel_rt;
+ else
+ sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel_nonrt;
#endif
sa.sa_flags = 0;
__sigaction(__pthread_sig_cancel, &sa, NULL);
@@ -564,54 +568,38 @@ static void pthread_exit_process(int retcode, void *arg)
in the thread descriptor, and optionally performs a siglongjmp
(for pthread_cond_timedwait). */
-#ifndef __i386__
static void pthread_handle_sigrestart(int sig)
{
pthread_descr self = thread_self();
-#else
-static void pthread_handle_sigrestart(int sig, struct sigcontext ctx)
-{
- pthread_descr self;
- asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
- self = thread_self();
-#endif
THREAD_SETMEM(self, p_signal, sig);
if (THREAD_GETMEM(self, p_signal_jmp) != NULL)
siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1);
}
#ifdef __i386__
+static void pthread_handle_sigrestart_nonrt(int sig, struct sigcontext ctx)
+{
+ asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
+ pthread_handle_sigrestart(sig);
+}
+
static void pthread_handle_sigrestart_rt(int sig, struct siginfo *si,
struct ucontext *uc)
{
- pthread_descr self;
asm volatile ("movw %w0,%%gs" : : "r" (uc->uc_mcontext.gregs[GS]));
- self = thread_self();
- THREAD_SETMEM(self, p_signal, sig);
- if (THREAD_GETMEM(self, p_signal_jmp) != NULL)
- siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1);
+ pthread_handle_sigrestart(sig);
}
#endif
-
/* The handler for the CANCEL signal checks for cancellation
(in asynchronous mode), for process-wide exit and exec requests.
For the thread manager thread, redirect the signal to
__pthread_manager_sighandler. */
-#ifndef __i386__
static void pthread_handle_sigcancel(int sig)
{
pthread_descr self = thread_self();
sigjmp_buf * jmpbuf;
-#else
-static void pthread_handle_sigcancel(int sig, struct sigcontext ctx)
-{
- pthread_descr self;
- sigjmp_buf * jmpbuf;
- asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
- self = thread_self();
-#endif
if (self == &__pthread_manager_thread)
{
@@ -637,6 +625,21 @@ static void pthread_handle_sigcancel(int sig, struct sigcontext ctx)
}
}
+#ifdef __i386__
+static void pthread_handle_sigcancel_nonrt(int sig, struct sigcontext ctx)
+{
+ asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
+ pthread_handle_sigcancel(sig);
+}
+
+static void pthread_handle_sigcancel_rt(int sig, struct siginfo *si,
+ struct ucontext *uc)
+{
+ asm volatile ("movw %w0,%%gs" : : "r" (uc->uc_mcontext.gregs[GS]));
+ pthread_handle_sigcancel(sig);
+}
+#endif
+
/* Handler for the DEBUG signal.
The debugging strategy is as follows:
On reception of a REQ_DEBUG request (sent by new threads created to
diff --git a/linuxthreads/signals.c b/linuxthreads/signals.c
index 0c9bffd00b..5a4d4f5db4 100644
--- a/linuxthreads/signals.c
+++ b/linuxthreads/signals.c
@@ -79,8 +79,12 @@ static union
/* The wrapper around user-provided signal handlers */
static void pthread_sighandler(int signo, SIGCONTEXT ctx)
{
- pthread_descr self = thread_self();
+ pthread_descr self;
char * in_sighandler;
+#ifdef __i386__
+ asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
+#endif
+ self = thread_self();
/* If we're in a sigwait operation, just record the signal received
and return without calling the user's handler */
if (THREAD_GETMEM(self, p_sigwaiting)) {
@@ -102,8 +106,12 @@ static void pthread_sighandler(int signo, SIGCONTEXT ctx)
static void pthread_sighandler_rt(int signo, struct siginfo *si,
struct ucontext *uc)
{
- pthread_descr self = thread_self();
+ pthread_descr self;
char * in_sighandler;
+#ifdef __i386__
+ asm volatile ("movw %w0,%%gs" : : "r" (uc->uc_mcontext.gregs[GS]));
+#endif
+ self = thread_self();
/* If we're in a sigwait operation, just record the signal received
and return without calling the user's handler */
if (THREAD_GETMEM(self, p_sigwaiting)) {
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 3e31b44e46..b71c8ce2dc 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -204,7 +204,7 @@ print_screen (int ok, int xfail)
{
if (output_points
&& (verbose > 1
- || ((verbose == 1) && (ok == xfail))))
+ || (verbose == 1 && ok == xfail)))
return 1;
return 0;
}
@@ -280,8 +280,8 @@ print_complex_function_ulps (const char *function_name, FLOAT real_ulp,
CHOOSE("ldouble", "double", "float",
"ildouble", "idouble", "ifloat"), imag_ulp);
}
-
-
+
+
}
}
@@ -537,7 +537,7 @@ check_complex (const char *test_name, __complex__ FLOAT computed,
part_exp = __real__ expected;
part_max_ulp = __real__ max_ulp;
part_xfail = __real__ xfail;
-
+
check_float_internal (str, part_comp, part_exp, part_max_ulp, part_xfail,
exception, &real_max_error);
@@ -546,7 +546,7 @@ check_complex (const char *test_name, __complex__ FLOAT computed,
part_exp = __imag__ expected;
part_max_ulp = __imag__ max_ulp;
part_xfail = __imag__ xfail;
-
+
/* Don't check again for exceptions, just pass through the
zero/inf sign test. */
check_float_internal (str, part_comp, part_exp, part_max_ulp, part_xfail,
@@ -764,8 +764,11 @@ asinh_test (void)
TEST_f_f (asinh, 0, 0);
TEST_f_f (asinh, minus_zero, minus_zero);
+#ifndef TEST_INLINE
TEST_f_f (asinh, plus_infty, plus_infty);
TEST_f_f (asinh, minus_infty, minus_infty);
+#endif
+ TEST_f_f (asinh, nan_value, nan_value);
TEST_f_f (asinh, 0.7, 0.652666566082355786L);
END (asinh);
@@ -782,6 +785,7 @@ atan_test (void)
TEST_f_f (atan, plus_infty, M_PI_2l);
TEST_f_f (atan, minus_infty, -M_PI_2l);
+ TEST_f_f (atan, nan_value, nan_value);
TEST_f_f (atan, 1, M_PI_4l);
TEST_f_f (atan, -1, -M_PI_4l);
@@ -805,6 +809,7 @@ atanh_test (void)
TEST_f_f (atanh, 1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (atanh, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
+ TEST_f_f (atanh, nan_value, nan_value);
/* atanh (x) == NaN plus invalid exception if |x| > 1. */
TEST_f_f (atanh, 1.1, nan_value, INVALID_EXCEPTION);
@@ -872,6 +877,7 @@ atan2_test (void)
TEST_ff_f (atan2, minus_infty, plus_infty, -M_PI_4l);
TEST_ff_f (atan2, plus_infty, minus_infty, M_PI_34l);
TEST_ff_f (atan2, minus_infty, minus_infty, -M_PI_34l);
+ TEST_ff_f (atan2, nan_value, nan_value, nan_value);
TEST_ff_f (atan2, 0.7, 1, 0.6107259643892086165L);
TEST_ff_f (atan2, 0.4, 0.0003, 1.5700463269355215718L);
@@ -1096,6 +1102,8 @@ carg_test (void)
TEST_c_f (carg, minus_infty, minus_infty, -3 * M_PI_4l);
+ TEST_c_f (carg, nan_value, nan_value, nan_value);
+
END (carg);
}
@@ -1495,6 +1503,7 @@ ceil_test (void)
TEST_f_f (ceil, minus_zero, minus_zero);
TEST_f_f (ceil, plus_infty, plus_infty);
TEST_f_f (ceil, minus_infty, minus_infty);
+ TEST_f_f (ceil, nan_value, nan_value);
TEST_f_f (ceil, M_PIl, 4.0);
TEST_f_f (ceil, -M_PIl, -3.0);
@@ -1747,6 +1756,7 @@ cos_test (void)
TEST_f_f (cos, minus_zero, 1);
TEST_f_f (cos, plus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (cos, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (cos, nan_value, nan_value);
TEST_f_f (cos, M_PI_6l * 2.0, 0.5);
TEST_f_f (cos, M_PI_6l * 4.0, -0.5);
@@ -1764,8 +1774,11 @@ cosh_test (void)
TEST_f_f (cosh, 0, 1);
TEST_f_f (cosh, minus_zero, 1);
+#ifndef TEST_INLINE
TEST_f_f (cosh, plus_infty, plus_infty);
TEST_f_f (cosh, minus_infty, plus_infty);
+#endif
+ TEST_f_f (cosh, nan_value, nan_value);
TEST_f_f (cosh, 0.7, 1.255169005630943018L);
END (cosh);
@@ -1783,6 +1796,8 @@ cpow_test (void)
TEST_cc_c (cpow, M_El, 0, 0, 2 * M_PIl, 1.0, 0.0);
TEST_cc_c (cpow, 2, 3, 4, 0, -119.0, -120.0);
+ TEST_cc_c (cpow, nan_value, nan_value, nan_value, nan_value, nan_value, nan_value);
+
END (cpow, complex);
}
@@ -2128,6 +2143,7 @@ erf_test (void)
TEST_f_f (erf, minus_zero, minus_zero);
TEST_f_f (erf, plus_infty, 1);
TEST_f_f (erf, minus_infty, -1);
+ TEST_f_f (erf, nan_value, nan_value);
TEST_f_f (erf, 0.7, 0.67780119383741847297L);
@@ -2155,6 +2171,7 @@ erfc_test (void)
TEST_f_f (erfc, minus_infty, 2.0);
TEST_f_f (erfc, 0.0, 1.0);
TEST_f_f (erfc, minus_zero, 1.0);
+ TEST_f_f (erfc, nan_value, nan_value);
TEST_f_f (erfc, 0.7, 0.32219880616258152702L);
@@ -2174,8 +2191,11 @@ exp_test (void)
TEST_f_f (exp, 0, 1);
TEST_f_f (exp, minus_zero, 1);
+#ifndef TEST_INLINE
TEST_f_f (exp, plus_infty, plus_infty);
TEST_f_f (exp, minus_infty, 0);
+#endif
+ TEST_f_f (exp, nan_value, nan_value);
TEST_f_f (exp, 1, M_El);
TEST_f_f (exp, 2, M_E2l);
@@ -2202,6 +2222,7 @@ exp10_test (void)
TEST_f_f (exp10, plus_infty, plus_infty);
TEST_f_f (exp10, minus_infty, 0);
+ TEST_f_f (exp10, nan_value, nan_value);
TEST_f_f (exp10, 3, 1000);
TEST_f_f (exp10, -1, 0.1);
TEST_f_f (exp10, 1e6, plus_infty);
@@ -2226,6 +2247,8 @@ exp2_test (void)
TEST_f_f (exp2, minus_zero, 1);
TEST_f_f (exp2, plus_infty, plus_infty);
TEST_f_f (exp2, minus_infty, 0);
+ TEST_f_f (exp2, nan_value, nan_value);
+
TEST_f_f (exp2, 10, 1024);
TEST_f_f (exp2, -1, 0.5);
TEST_f_f (exp2, 1e6, plus_infty);
@@ -2243,8 +2266,11 @@ expm1_test (void)
TEST_f_f (expm1, 0, 0);
TEST_f_f (expm1, minus_zero, minus_zero);
+#ifndef TEST_INLINE
TEST_f_f (expm1, plus_infty, plus_infty);
TEST_f_f (expm1, minus_infty, -1);
+#endif
+ TEST_f_f (expm1, nan_value, nan_value);
TEST_f_f (expm1, 1, M_El - 1.0);
TEST_f_f (expm1, 0.7, 1.0137527074704765216L);
@@ -2262,6 +2288,7 @@ fabs_test (void)
TEST_f_f (fabs, plus_infty, plus_infty);
TEST_f_f (fabs, minus_infty, plus_infty);
+ TEST_f_f (fabs, nan_value, nan_value);
TEST_f_f (fabs, 38.0, 38.0);
TEST_f_f (fabs, -M_El, M_El);
@@ -2312,6 +2339,7 @@ floor_test (void)
TEST_f_f (floor, minus_zero, minus_zero);
TEST_f_f (floor, plus_infty, plus_infty);
TEST_f_f (floor, minus_infty, minus_infty);
+ TEST_f_f (floor, nan_value, nan_value);
TEST_f_f (floor, M_PIl, 3.0);
TEST_f_f (floor, -M_PIl, -4.0);
@@ -2447,6 +2475,8 @@ fmod_test (void)
/* fmod (x, -inf) == x for x not infinite. */
TEST_ff_f (fmod, 3.0, minus_infty, 3.0);
+ TEST_ff_f (fmod, nan_value, nan_value, nan_value);
+
TEST_ff_f (fmod, 6.5, 2.3, 1.9);
TEST_ff_f (fmod, -6.5, 2.3, -1.9);
TEST_ff_f (fmod, 6.5, -2.3, 1.9);
@@ -2509,6 +2539,7 @@ gamma_test (void)
TEST_f_f (gamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (gamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (gamma, minus_infty, plus_infty);
+ TEST_f_f (gamma, nan_value, nan_value);
TEST_f_f1 (gamma, 1, 0, 1);
TEST_f_f1 (gamma, 3, M_LN2l, 1);
@@ -2527,10 +2558,12 @@ hypot_test (void)
TEST_ff_f (hypot, plus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
TEST_ff_f (hypot, minus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
+#ifndef TEST_INLINE
TEST_ff_f (hypot, plus_infty, nan_value, plus_infty);
TEST_ff_f (hypot, minus_infty, nan_value, plus_infty);
TEST_ff_f (hypot, nan_value, plus_infty, plus_infty);
TEST_ff_f (hypot, nan_value, minus_infty, plus_infty);
+#endif
TEST_ff_f (hypot, nan_value, nan_value, nan_value);
@@ -2759,6 +2792,7 @@ lgamma_test (void)
TEST_f_f (lgamma, plus_infty, plus_infty);
TEST_f_f (lgamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
+ TEST_f_f (lgamma, nan_value, nan_value);
/* lgamma (x) == +inf plus divide by zero exception for integer x <= 0. */
TEST_f_f (lgamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
@@ -2881,6 +2915,7 @@ log10_test (void)
TEST_f_f (log10, -1, nan_value, INVALID_EXCEPTION);
TEST_f_f (log10, plus_infty, plus_infty);
+ TEST_f_f (log10, nan_value, nan_value);
TEST_f_f (log10, 0.1L, -1);
TEST_f_f (log10, 10.0, 1);
@@ -2905,6 +2940,7 @@ log1p_test (void)
TEST_f_f (log1p, -2, nan_value, INVALID_EXCEPTION);
TEST_f_f (log1p, plus_infty, plus_infty);
+ TEST_f_f (log1p, nan_value, nan_value);
TEST_f_f (log1p, M_El - 1.0, 1);
@@ -2927,6 +2963,7 @@ log2_test (void)
TEST_f_f (log2, -1, nan_value, INVALID_EXCEPTION);
TEST_f_f (log2, plus_infty, plus_infty);
+ TEST_f_f (log2, nan_value, nan_value);
TEST_f_f (log2, M_El, M_LOG2El);
TEST_f_f (log2, 2.0, 1);
@@ -2949,6 +2986,7 @@ logb_test (void)
TEST_f_f (logb, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (logb, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
+ TEST_f_f (logb, nan_value, nan_value);
TEST_f_f (logb, 1, 0);
TEST_f_f (logb, M_El, 1);
@@ -3063,6 +3101,7 @@ nearbyint_test (void)
TEST_f_f (nearbyint, minus_zero, minus_zero);
TEST_f_f (nearbyint, plus_infty, plus_infty);
TEST_f_f (nearbyint, minus_infty, minus_infty);
+ TEST_f_f (nearbyint, nan_value, nan_value);
END (nearbyint);
}
@@ -3139,6 +3178,7 @@ pow_test (void)
TEST_ff_f (pow, nan_value, minus_zero, 1);
+#ifndef TEST_INLINE
TEST_ff_f (pow, 1.1, plus_infty, plus_infty);
TEST_ff_f (pow, plus_infty, plus_infty, plus_infty);
TEST_ff_f (pow, -1.1, plus_infty, plus_infty);
@@ -3190,6 +3230,7 @@ pow_test (void)
TEST_ff_f (pow, minus_infty, -1.1, 0);
TEST_ff_f (pow, minus_infty, -11.1, 0);
TEST_ff_f (pow, minus_infty, -1001.1, 0);
+#endif
TEST_ff_f (pow, nan_value, nan_value, nan_value);
TEST_ff_f (pow, 0, nan_value, nan_value);
@@ -3236,6 +3277,7 @@ pow_test (void)
TEST_ff_f (pow, minus_zero, 2, 0);
TEST_ff_f (pow, minus_zero, 11.1, 0);
+#ifndef TEST_INLINE
/* pow (x, +inf) == +inf for |x| > 1. */
TEST_ff_f (pow, 1.5, plus_infty, plus_infty);
@@ -3247,6 +3289,7 @@ pow_test (void)
/* pow (x, -inf) == +inf for |x| < 1. */
TEST_ff_f (pow, 0.5, minus_infty, plus_infty);
+#endif
/* pow (+inf, y) == +inf for y > 0. */
TEST_ff_f (pow, plus_infty, 2, plus_infty);
@@ -3296,6 +3339,7 @@ remainder_test (void)
TEST_ff_f (remainder, 1, minus_zero, nan_value, INVALID_EXCEPTION);
TEST_ff_f (remainder, plus_infty, 1, nan_value, INVALID_EXCEPTION);
TEST_ff_f (remainder, minus_infty, 1, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (remainder, nan_value, nan_value, nan_value);
TEST_ff_f (remainder, 1.625, 1.0, -0.375);
TEST_ff_f (remainder, -1.625, 1.0, 0.375);
@@ -3319,6 +3363,7 @@ remquo_test (void)
TEST_ffI_f1 (remquo, 1, minus_zero, nan_value, IGNORE, INVALID_EXCEPTION);
TEST_ffI_f1 (remquo, plus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION);
TEST_ffI_f1 (remquo, minus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION);
+ TEST_ffI_f1 (remquo, nan_value, nan_value, nan_value, IGNORE);
TEST_ffI_f1 (remquo, 1.625, 1.0, -0.375, 2);
TEST_ffI_f1 (remquo, -1.625, 1.0, 0.375, -2);
@@ -3496,6 +3541,7 @@ sin_test (void)
TEST_f_f (sin, minus_zero, minus_zero);
TEST_f_f (sin, plus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (sin, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (sin, nan_value, nan_value);
TEST_f_f (sin, M_PI_6l, 0.5);
TEST_f_f (sin, -M_PI_6l, -0.5);
@@ -3520,6 +3566,7 @@ sincos_test (void)
TEST_extra (sincos, minus_zero, minus_zero, 1);
TEST_extra (sincos, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
TEST_extra (sincos, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_extra (sincos, nan_value, nan_value, nan_value);
TEST_extra (sincos, M_PI_2l, 1, 0);
TEST_extra (sincos, M_PI_6l, 0.5, 0.866025403784438646764L);
@@ -3536,8 +3583,11 @@ sinh_test (void)
TEST_f_f (sinh, 0, 0);
TEST_f_f (sinh, minus_zero, minus_zero);
+#ifndef TEST_INLINE
TEST_f_f (sinh, plus_infty, plus_infty);
TEST_f_f (sinh, minus_infty, minus_infty);
+#endif
+ TEST_f_f (sinh, nan_value, nan_value);
TEST_f_f (sinh, 0.7, 0.75858370183953350346L);
@@ -3558,6 +3608,7 @@ sqrt_test (void)
/* sqrt (x) == NaN plus invalid exception for x < 0. */
TEST_f_f (sqrt, -1, nan_value, INVALID_EXCEPTION);
TEST_f_f (sqrt, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (sqrt, nan_value, nan_value);
TEST_f_f (sqrt, 2209, 47);
TEST_f_f (sqrt, 4, 2);
@@ -3579,6 +3630,7 @@ tan_test (void)
TEST_f_f (tan, minus_zero, minus_zero);
TEST_f_f (tan, plus_infty, nan_value, INVALID_EXCEPTION);
TEST_f_f (tan, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (tan, nan_value, nan_value);
TEST_f_f (tan, M_PI_4l, 1);
TEST_f_f (tan, 0.7, 0.84228838046307944813L);
@@ -3594,8 +3646,11 @@ tanh_test (void)
TEST_f_f (tanh, 0, 0);
TEST_f_f (tanh, minus_zero, minus_zero);
+#ifndef TEST_INLINE
TEST_f_f (tanh, plus_infty, 1);
TEST_f_f (tanh, minus_infty, -1);
+#endif
+ TEST_f_f (tanh, nan_value, nan_value);
TEST_f_f (tanh, 0.7, 0.60436777711716349631L);
@@ -3620,6 +3675,7 @@ tgamma_test (void)
/* tgamma (x) == NaN plus invalid exception for integer x <= 0. */
TEST_f_f (tgamma, -2, nan_value, INVALID_EXCEPTION);
TEST_f_f (tgamma, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (tgamma, nan_value, nan_value);
TEST_f_f (tgamma, 0.5, M_SQRT_PIl);
TEST_f_f (tgamma, -0.5, -M_2_SQRT_PIl);
diff --git a/math/math.h b/math/math.h
index f43def0044..e76b36a798 100644
--- a/math/math.h
+++ b/math/math.h
@@ -171,10 +171,10 @@ enum
(sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
# else
# define fpclassify(x) \
- (sizeof (x) == sizeof (float) ? \
- __fpclassifyf (x) \
- : sizeof (x) == sizeof (double) ? \
- __fpclassify (x) : __fpclassifyl (x))
+ (sizeof (x) == sizeof (float) \
+ ? __fpclassifyf (x) \
+ : sizeof (x) == sizeof (double) \
+ ? __fpclassify (x) : __fpclassifyl (x))
# endif
/* Return nonzero value if sign of X is negative. */
@@ -183,10 +183,10 @@ enum
(sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
# else
# define signbit(x) \
- (sizeof (x) == sizeof (float) ? \
- __signbitf (x) \
- : sizeof (x) == sizeof (double) ? \
- __signbit (x) : __signbitl (x))
+ (sizeof (x) == sizeof (float) \
+ ? __signbitf (x) \
+ : sizeof (x) == sizeof (double) \
+ ? __signbit (x) : __signbitl (x))
# endif
/* Return nonzero value if X is not +-Inf or NaN. */
@@ -195,10 +195,10 @@ enum
(sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
# else
# define isfinite(x) \
- (sizeof (x) == sizeof (float) ? \
- __finitef (x) \
- : sizeof (x) == sizeof (double) ? \
- __finite (x) : __finitel (x))
+ (sizeof (x) == sizeof (float) \
+ ? __finitef (x) \
+ : sizeof (x) == sizeof (double) \
+ ? __finite (x) : __finitel (x))
# endif
/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
@@ -211,10 +211,10 @@ enum
(sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
# else
# define isnan(x) \
- (sizeof (x) == sizeof (float) ? \
- __isnanf (x) \
- : sizeof (x) == sizeof (double) ? \
- __isnan (x) : __isnanl (x))
+ (sizeof (x) == sizeof (float) \
+ ? __isnanf (x) \
+ : sizeof (x) == sizeof (double) \
+ ? __isnan (x) : __isnanl (x))
# endif
/* Return nonzero value is X is positive or negative infinity. */
@@ -223,10 +223,10 @@ enum
(sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
# else
# define isinf(x) \
- (sizeof (x) == sizeof (float) ? \
- __isinff (x) \
- : sizeof (x) == sizeof (double) ? \
- __isinf (x) : __isinfl (x))
+ (sizeof (x) == sizeof (float) \
+ ? __isinff (x) \
+ : sizeof (x) == sizeof (double) \
+ ? __isinf (x) : __isinfl (x))
# endif
#endif /* Use ISO C 9X. */
diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h
index bf077ba527..8545f6536c 100644
--- a/sysdeps/i386/fpu/bits/mathinline.h
+++ b/sysdeps/i386/fpu/bits/mathinline.h
@@ -324,7 +324,7 @@ __sincosl (long double __x, long double *__sinx, long double *__cosx)
("fscale # 2^int(x * log2(e))\n\t" \
: "=t" (__temp) : "0" (1.0), "u" (__exponent)); \
__temp -= 1.0; \
- return __temp + __value
+ return __temp + __value ?: __x
__inline_mathcode_ (long double, __expm1l, __x, __expm1_code)
@@ -383,8 +383,14 @@ __inline_mathcode2 (pow, __x, __y, \
register long double __value; \
register long double __exponent; \
__extension__ long long int __p = (long long int) __y; \
- if (__x == 0.0 && __y > 0.0) \
- return 0.0; \
+ if (__x == 0.0) \
+ { \
+ if (__y > 0.0) \
+ return __y == (double) __p && (__p & 1) != 0 ? __x : 0.0; \
+ else if (__y < 0.0) \
+ return (__y == (double) __p && (-__p & 1) != 0 \
+ ? 1.0 / __x : 1.0 / fabs (__x)); \
+ } \
if (__y == (double) __p) \
{ \
long double __r = 1.0; \
@@ -448,7 +454,12 @@ __inline_mathop_decl (log10, "fldlg2; fxch; fyl2x", "0" (__x) : "st(1)")
__inline_mathcode (asin, __x, return __atan2l (__x, __sqrtl (1.0 - __x * __x)))
__inline_mathcode (acos, __x, return __atan2l (__sqrtl (1.0 - __x * __x), __x))
-__inline_mathcode_ (long double, __sgn1l, __x, return __x >= 0.0 ? 1.0 : -1.0)
+__inline_mathcode_ (long double, __sgn1l, __x, \
+ union { long double __xld; unsigned int __xi[3]; } __n = { .__xld = __x }; \
+ __n.__xi[2] = (__n.__xi[2] & 0x8000) | 0x3fff; \
+ __n.__xi[1] = 0x80000000; \
+ __n.__xi[0] = 0; \
+ return __n.__xld)
/* The argument range of the inline version of sinhl is slightly reduced. */
diff --git a/sysdeps/i386/fpu/e_atanh.S b/sysdeps/i386/fpu/e_atanh.S
index 231e96f57f..3cd0362459 100644
--- a/sysdeps/i386/fpu/e_atanh.S
+++ b/sysdeps/i386/fpu/e_atanh.S
@@ -1,5 +1,5 @@
/* ix87 specific implementation of arctanh function.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -50,6 +50,12 @@ ln2_2: .tfloat 0.3465735902799726547086160
ENTRY(__ieee754_atanh)
movl 8(%esp), %ecx
+ movl %ecx, %eax
+ andl $0x7fffffff, %eax
+ cmpl $0x7ff00000, %eax
+ jae 5f
+7:
+
#ifdef PIC
call 1f
1: popl %edx
@@ -98,4 +104,11 @@ ENTRY(__ieee754_atanh)
jecxz 3f
fchs // 0.5*ln2*ld((1+x)/(1-x))
3: ret
+
+ // x == NaN or ħInf
+5: ja 6f
+ cmpl $0, 4(%esp)
+ je 7b
+6: fldl 4(%esp)
+ ret
END(__ieee754_atanh)
diff --git a/sysdeps/i386/fpu/e_atanhf.S b/sysdeps/i386/fpu/e_atanhf.S
index 687d4c97fb..46f2c8dab4 100644
--- a/sysdeps/i386/fpu/e_atanhf.S
+++ b/sysdeps/i386/fpu/e_atanhf.S
@@ -1,5 +1,5 @@
/* ix87 specific implementation of arctanh function.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -51,6 +51,11 @@ ln2_2: .tfloat 0.3465735902799726547086160
ENTRY(__ieee754_atanhf)
movl 4(%esp), %ecx
+ movl %ecx, %eax
+ andl $0x7fffffff, %eax
+ cmpl $0x7f800000, %eax
+ ja 5f
+
#ifdef PIC
call 1f
1: popl %edx
@@ -99,4 +104,8 @@ ENTRY(__ieee754_atanhf)
jecxz 3f
fchs // 0.5*ln2*ld((1+x)/(1-x))
3: ret
+
+ // x == NaN
+5: flds 4(%esp)
+ ret
END(__ieee754_atanhf)
diff --git a/sysdeps/i386/fpu/e_atanhl.S b/sysdeps/i386/fpu/e_atanhl.S
index 8a2bd11ce4..5100d1046c 100644
--- a/sysdeps/i386/fpu/e_atanhl.S
+++ b/sysdeps/i386/fpu/e_atanhl.S
@@ -1,5 +1,5 @@
/* ix87 specific implementation of arctanh function.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -57,6 +57,12 @@ ln2_2: .tfloat 0.3465735902799726547086160
ENTRY(__ieee754_atanhl)
movl 12(%esp), %ecx
+ movl %ecx, %eax
+ andl $0x7fff, %eax
+ cmpl $0x7fff, %eax
+ je 5f
+7:
+
#ifdef PIC
call 1f
1: popl %edx
@@ -105,4 +111,12 @@ ENTRY(__ieee754_atanhl)
jecxz 3f
fchs // 0.5*ln2*ld((1+x)/(1-x))
3: ret
+
+ // x == NaN or ħInf
+5: cmpl $0x80000000, 8(%esp)
+ ja 6f
+ cmpl $0, 4(%esp)
+ je 7b
+6: fldt 4(%esp)
+ ret
END(__ieee754_atanhl)
diff --git a/sysdeps/i386/fpu/e_log10.S b/sysdeps/i386/fpu/e_log10.S
index 2c8488c3a9..e93184c219 100644
--- a/sysdeps/i386/fpu/e_log10.S
+++ b/sysdeps/i386/fpu/e_log10.S
@@ -41,8 +41,12 @@ ENTRY(__ieee754_log10)
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
+ fxam
+ fnstsw
fld %st // x : x : log10(2)
- fsubl MO(one) // x-1 : x : log10(2)
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fsubl MO(one) // x-1 : x : log10(2)
fld %st // x-1 : x-1 : x : log10(2)
fabs // |x-1| : x-1 : x : log10(2)
fcompl MO(limit) // x-1 : x : log10(2)
@@ -56,4 +60,9 @@ ENTRY(__ieee754_log10)
2: fstp %st(0) // x : log10(2)
fyl2x // log10(x)
ret
+
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
END (__ieee754_log10)
diff --git a/sysdeps/i386/fpu/e_log10f.S b/sysdeps/i386/fpu/e_log10f.S
index 2c07161085..0a89f54784 100644
--- a/sysdeps/i386/fpu/e_log10f.S
+++ b/sysdeps/i386/fpu/e_log10f.S
@@ -42,8 +42,12 @@ ENTRY(__ieee754_log10f)
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
+ fxam
+ fnstsw
fld %st // x : x : log10(2)
- fsubl MO(one) // x-1 : x : log10(2)
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fsubl MO(one) // x-1 : x : log10(2)
fld %st // x-1 : x-1 : x : log10(2)
fabs // |x-1| : x-1 : x : log10(2)
fcompl MO(limit) // x-1 : x : log10(2)
@@ -57,4 +61,9 @@ ENTRY(__ieee754_log10f)
2: fstp %st(0) // x : log10(2)
fyl2x // log10(x)
ret
+
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
END (__ieee754_log10f)
diff --git a/sysdeps/i386/fpu/e_log10l.S b/sysdeps/i386/fpu/e_log10l.S
index 6fe7c5a6f7..25d3501663 100644
--- a/sysdeps/i386/fpu/e_log10l.S
+++ b/sysdeps/i386/fpu/e_log10l.S
@@ -43,8 +43,12 @@ ENTRY(__ieee754_log10l)
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
+ fxam
+ fnstsw
fld %st // x : x : log10(2)
- fsubl MO(one) // x-1 : x : log10(2)
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fsubl MO(one) // x-1 : x : log10(2)
fld %st // x-1 : x-1 : x : log10(2)
fabs // |x-1| : x-1 : x : log10(2)
fcompl MO(limit) // x-1 : x : log10(2)
@@ -58,4 +62,9 @@ ENTRY(__ieee754_log10l)
2: fstp %st(0) // x : log10(2)
fyl2x // log10(x)
ret
+
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
END(__ieee754_log10l)
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
new file mode 100644
index 0000000000..c31b010e3e
--- /dev/null
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -0,0 +1,1428 @@
+# Begin of automatic generation
+
+# acos
+Test "acos (0.7) == 0.7953988301841435554":
+ildouble: 1149
+ldouble: 1149
+
+# asin
+Test "asin (0.7) == 0.7753974966107530637":
+double: 1
+ildouble: 1147
+ldouble: 1147
+
+# asinh
+Test "asinh (-0) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "asinh (0.7) == 0.652666566082355786":
+ildouble: 656
+ldouble: 656
+
+# atan
+Test "atan (0.7) == 0.6107259643892086165":
+ildouble: 549
+ldouble: 549
+
+# atan2
+Test "atan2 (0.4, 0.0003) == 1.5700463269355215718":
+ildouble: 1
+ldouble: 1
+Test "atan2 (0.7, 1) == 0.6107259643892086165":
+ildouble: 549
+ldouble: 549
+
+# atanh
+Test "atanh (-0) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "atanh (0.7) == 0.8673005276940531944":
+double: 1
+idouble: 1
+ildouble: 1605
+ldouble: 1605
+
+# cabs
+Test "cabs (-0.7 + 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-0.7 - 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-12.4 + 0.7 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-12.4 - 0.7 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (0.7 + 1.2 i) == 1.3892443989449804508":
+double: 1
+idouble: 1
+ildouble: 560
+ldouble: 560
+Test "cabs (0.7 + 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+
+# cacos
+Test "Real part of: cacos (-2 - 3 i) == 2.1414491111159960199 + 1.9833870299165354323 i":
+Test "Imaginary part of: cacos (-2 - 3 i) == 2.1414491111159960199 + 1.9833870299165354323 i":
+ildouble: 1
+ldouble: 1
+Test "Real part of: cacos (0.7 + 1.2 i) == 1.1351827477151551089 - 1.0927647857577371459 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 151
+ldouble: 151
+Test "Imaginary part of: cacos (0.7 + 1.2 i) == 1.1351827477151551089 - 1.0927647857577371459 i":
+float: 2
+ifloat: 2
+ildouble: 329
+ldouble: 329
+
+# cacosh
+Test "Real part of: cacosh (-2 - 3 i) == -1.9833870299165354323 + 2.1414491111159960199 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+ildouble: 5
+ldouble: 5
+Test "Imaginary part of: cacosh (-2 - 3 i) == -1.9833870299165354323 + 2.1414491111159960199 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+ildouble: 1
+ldouble: 1
+Test "Real part of: cacosh (0.7 + 1.2 i) == 1.0927647857577371459 + 1.1351827477151551089 i":
+double: 1
+idouble: 1
+ildouble: 328
+ldouble: 328
+Test "Imaginary part of: cacosh (0.7 + 1.2 i) == 1.0927647857577371459 + 1.1351827477151551089 i":
+ildouble: 151
+ldouble: 151
+
+# casin
+Test "Real part of: casin (-2 - 3 i) == -0.5706527843210994007 - 1.9833870299165354323 i":
+Test "Imaginary part of: casin (-2 - 3 i) == -0.5706527843210994007 - 1.9833870299165354323 i":
+ildouble: 1
+ldouble: 1
+Test "Real part of: casin (0.7 + 1.2 i) == 0.4356135790797415103 + 1.0927647857577371459 i":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+ildouble: 603
+ldouble: 603
+Test "Imaginary part of: casin (0.7 + 1.2 i) == 0.4356135790797415103 + 1.0927647857577371459 i":
+float: 2
+ifloat: 2
+ildouble: 329
+ldouble: 329
+
+# casinh
+Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917 - 0.9646585044076027920 i":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+ildouble: 6
+ldouble: 6
+Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917 - 0.9646585044076027920 i":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+ildouble: 6
+ldouble: 6
+Test "Real part of: casinh (0.7 + 1.2 i) == 0.9786545955936738768 + 0.9113541895315601156 i":
+ildouble: 892
+ldouble: 892
+Test "Imaginary part of: casinh (0.7 + 1.2 i) == 0.9786545955936738768 + 0.9113541895315601156 i":
+float: 1
+ifloat: 1
+ildouble: 12
+ldouble: 12
+
+# catan
+Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225 - 0.2290726829685387662 i":
+Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225 - 0.2290726829685387662 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 7
+ldouble: 7
+Test "Real part of: catan (0.7 + 1.2 i) == 1.0785743834118921877 + 0.5770573776534306764 i":
+ildouble: 251
+ldouble: 251
+Test "Imaginary part of: catan (0.7 + 1.2 i) == 1.0785743834118921877 + 0.5770573776534306764 i":
+float: 1
+ifloat: 1
+ildouble: 474
+ldouble: 474
+
+# catanh
+Test "Real part of: catanh (-2 - 3 i) == -0.1469466662255297520 - 1.3389725222944935611 i":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 2
+ldouble: 2
+Test "Imaginary part of: catanh (-2 - 3 i) == -0.1469466662255297520 - 1.3389725222944935611 i":
+Test "Real part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959 + 0.9702403077950989849 i":
+ildouble: 66
+ldouble: 66
+Test "Imaginary part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959 + 0.9702403077950989849 i":
+ildouble: 447
+ldouble: 447
+
+# cbrt
+Test "cbrt (-0.001) == -0.1":
+ildouble: 716
+ldouble: 716
+Test "cbrt (-27.0) == -3.0":
+ildouble: 1
+ldouble: 1
+Test "cbrt (0.7) == 0.8879040017426007084":
+double: 1
+idouble: 1
+ildouble: 346
+ldouble: 346
+Test "cbrt (0.970299) == 0.99":
+ildouble: 306
+ldouble: 306
+
+# ccos
+Test "Real part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i":
+Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i":
+float: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 5
+ldouble: 5
+Test "Imaginary part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i":
+double: 1
+idouble: 1
+ildouble: 1901
+ldouble: 1901
+
+# ccosh
+Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i":
+Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1467
+ldouble: 1467
+Test "Imaginary part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i":
+ildouble: 1183
+ldouble: 1183
+
+# cexp
+Test "Real part of: cexp (-2.0 - 3.0 i) == -0.1339809149295426134 - 0.0190985162611351964 i":
+ildouble: 4
+ldouble: 4
+Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.1339809149295426134 - 0.0190985162611351964 i":
+ildouble: 18
+ldouble: 18
+Test "Real part of: cexp (0.7 + 1.2 i) == 0.7296989091503236012 + 1.8768962328348102821 i":
+float: 1
+ifloat: 1
+ildouble: 940
+ldouble: 940
+Test "Imaginary part of: cexp (0.7 + 1.2 i) == 0.7296989091503236012 + 1.8768962328348102821 i":
+ildouble: 1067
+ldouble: 1067
+
+# clog
+Test "Real part of: clog (-2 - 3 i) == 1.2824746787307683680 - 2.1587989303424641704 i":
+Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680 - 2.1587989303424641704 i":
+ildouble: 1
+ldouble: 1
+
+# clog10
+Test "Real part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i":
+Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i":
+double: 1
+idouble: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i":
+Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i":
+Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-inf + inf i) == inf + 3/4 pi*log10(e) i":
+Test "Imaginary part of: clog10 (-inf + inf i) == inf + 3/4 pi*log10(e) i":
+double: 1
+idouble: 1
+Test "Real part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i":
+Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i":
+Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 1402
+ldouble: 1402
+Test "Imaginary part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i":
+double: 1
+idouble: 1
+ildouble: 186
+ldouble: 186
+Test "Real part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i":
+Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i":
+Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i":
+Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# cos
+Test "cos (0.7) == 0.7648421872844884262":
+double: 1
+idouble: 1
+ildouble: 529
+ldouble: 529
+Test "cos (M_PI_6l * 2.0) == 0.5":
+double: 1
+float: 0.5
+idouble: 1
+ifloat: 0.5
+Test "cos (M_PI_6l * 4.0) == -0.5":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 0.5
+ldouble: 0.5
+Test "cos (pi/2) == 0":
+double: 0.2758
+float: 0.3667
+idouble: 0.2758
+ifloat: 0.3667
+ildouble: 0.25
+ldouble: 0.25
+
+# cosh
+Test "cosh (0.7) == 1.255169005630943018":
+ildouble: 309
+ldouble: 309
+
+# cpow
+Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+float: 1
+ifloat: 1
+ildouble: 2
+ldouble: 2
+Test "Real part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i":
+Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i":
+double: 1.104
+float: 2.5333
+idouble: 1.104
+ifloat: 2.5333
+ildouble: 1
+ldouble: 1
+
+# csin
+Test "Real part of: csin (0.7 + 1.2 i) == 1.1664563419657581376 + 1.1544997246948547371 i":
+ildouble: 966
+ldouble: 966
+Test "Imaginary part of: csin (0.7 + 1.2 i) == 1.1664563419657581376 + 1.1544997246948547371 i":
+ildouble: 168
+ldouble: 168
+
+# csinh
+Test "Real part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 2
+ldouble: 2
+Test "Real part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 413
+ldouble: 413
+Test "Imaginary part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i":
+ildouble: 477
+ldouble: 477
+
+# csqrt
+Test "Real part of: csqrt (-2 + 3 i) == 0.8959774761298381247 + 1.6741492280355400404 i":
+ildouble: 1
+ldouble: 1
+Test "Imaginary part of: csqrt (-2 + 3 i) == 0.8959774761298381247 + 1.6741492280355400404 i":
+Test "Real part of: csqrt (-2 - 3 i) == 0.8959774761298381247 - 1.6741492280355400404 i":
+ildouble: 1
+ldouble: 1
+Test "Imaginary part of: csqrt (-2 - 3 i) == 0.8959774761298381247 - 1.6741492280355400404 i":
+Test "Real part of: csqrt (0.7 + 1.2 i) == 1.0220676100300264507 + 0.5870453129635652115 i":
+double: 1
+idouble: 1
+ildouble: 237
+ldouble: 237
+Test "Imaginary part of: csqrt (0.7 + 1.2 i) == 1.0220676100300264507 + 0.5870453129635652115 i":
+ildouble: 128
+ldouble: 128
+
+# ctan
+Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i":
+ildouble: 437
+ldouble: 437
+Test "Imaginary part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i":
+float: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 690
+ldouble: 690
+Test "Imaginary part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i":
+double: 1
+idouble: 1
+ildouble: 367
+ldouble: 367
+
+# ctanh
+Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i":
+ildouble: 2
+ldouble: 2
+Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i":
+ildouble: 23
+ldouble: 23
+Test "Real part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+double: 0.5
+idouble: 0.5
+Test "Real part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
+float: 1
+ifloat: 1
+ildouble: 286
+ldouble: 286
+Test "Imaginary part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
+double: 1
+idouble: 1
+ildouble: 3074
+ldouble: 3074
+
+# erfc
+Test "erfc (0.7) == 0.32219880616258152702":
+double: 1
+idouble: 1
+Test "erfc (1.2) == 0.089686021770364619762":
+float: 1
+ifloat: 1
+Test "erfc (2.0) == 0.0046777349810472658379":
+double: 1
+idouble: 1
+Test "erfc (4.1) == 0.67000276540848983727e-8":
+double: 24
+float: 12
+idouble: 24
+ifloat: 12
+
+# exp
+Test "exp (0.7) == 2.0137527074704765216":
+ildouble: 412
+ldouble: 412
+
+# exp10
+Test "exp10 (-1) == 0.1":
+ildouble: 818
+ldouble: 818
+Test "exp10 (0.7) == 5.0118723362727228500":
+double: 1
+idouble: 1
+ildouble: 1182
+ldouble: 1182
+Test "exp10 (3) == 1000":
+ildouble: 8
+ldouble: 8
+
+# exp2
+Test "exp2 (0.7) == 1.6245047927124710452":
+ildouble: 462
+ldouble: 462
+
+# expm1
+Test "expm1 (-0) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "expm1 (0.7) == 1.0137527074704765216":
+ildouble: 825
+ldouble: 825
+
+# fmod
+Test "fmod (-6.5, -2.3) == -1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 4096
+ldouble: 4096
+Test "fmod (-6.5, 2.3) == -1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 4096
+ldouble: 4096
+Test "fmod (6.5, -2.3) == 1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 4096
+ldouble: 4096
+Test "fmod (6.5, 2.3) == 1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 4096
+ldouble: 4096
+
+# hypot
+Test "hypot (-0.7, -12.4) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (-0.7, 12.4) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (-12.4, -0.7) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (-12.4, 0.7) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (0.7, -12.4) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (0.7, 1.2) == 1.3892443989449804508":
+double: 1
+ildouble: 560
+ldouble: 560
+Test "hypot (0.7, 12.4) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (12.4, -0.7) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+Test "hypot (12.4, 0.7) == 12.41974234837422060118":
+float: 1
+ildouble: 406
+ldouble: 406
+
+# j0
+Test "j0 (10.0) == -0.24593576445134833520":
+float: 1
+ifloat: 1
+Test "j0 (2.0) == 0.22389077914123566805":
+float: 1
+ifloat: 1
+Test "j0 (8.0) == 0.17165080713755390609":
+float: 1
+ifloat: 1
+
+# j1
+Test "j1 (10.0) == 0.043472746168861436670":
+float: 1
+ifloat: 1
+Test "j1 (2.0) == 0.57672480775687338720":
+double: 1
+idouble: 1
+Test "j1 (8.0) == 0.23463634685391462438":
+float: 1
+ifloat: 1
+
+# jn
+Test "jn (0, 10.0) == -0.24593576445134833520":
+float: 1
+ifloat: 1
+Test "jn (0, 2.0) == 0.22389077914123566805":
+float: 1
+ifloat: 1
+Test "jn (0, 8.0) == 0.17165080713755390609":
+float: 1
+ifloat: 1
+Test "jn (1, 10.0) == 0.043472746168861436670":
+float: 1
+ifloat: 1
+Test "jn (1, 2.0) == 0.57672480775687338720":
+double: 1
+idouble: 1
+Test "jn (1, 8.0) == 0.23463634685391462438":
+float: 1
+ifloat: 1
+Test "jn (10, 0.1) == 0.26905328954342155795e-19":
+double: 4
+float: 2
+idouble: 4
+ifloat: 2
+Test "jn (10, 0.7) == 0.75175911502153953928e-11":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "jn (10, 10.0) == 0.20748610663335885770":
+float: 1
+ifloat: 1
+Test "jn (3, 0.1) == 0.000020820315754756261429":
+double: 1
+idouble: 1
+Test "jn (3, 0.7) == 0.0069296548267508408077":
+double: 2
+idouble: 2
+Test "jn (3, 10.0) == 0.058379379305186812343":
+float: 1
+ifloat: 1
+
+# lgamma
+Test "lgamma (0.7) == 0.26086724653166651439":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "lgamma (1.2) == -0.853740900033158497197e-1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# log
+Test "log (0.7) == -0.35667494393873237891":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 2341
+ldouble: 2341
+Test "log (e) == 1":
+float: 0.5
+ifloat: 0.5
+
+# log10
+Test "log10 (0.7) == -0.15490195998574316929":
+double: 1
+idouble: 1
+ildouble: 2033
+ldouble: 2033
+Test "log10 (e) == log10(e)":
+float: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+
+# log1p
+Test "log1p (-0.3) == -0.35667494393873237891":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 585
+ldouble: 585
+
+# log2
+Test "log2 (0.7) == -0.51457317282975824043":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1688
+ldouble: 1688
+
+# nexttoward
+Test "nexttoward (-0, 0) == 0":
+double: 0
+idouble: 0
+Test "nexttoward (0, -0) == -0":
+double: 0
+idouble: 0
+
+# pow
+Test "pow (-0, 1) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "pow (-0, 11) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "pow (-0, 27) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "pow (0.7, 1.2) == 0.65180494056638638188":
+ildouble: 725
+ldouble: 725
+
+# sin
+Test "sin (0.7) == 0.64421768723769105367":
+ildouble: 627
+ldouble: 627
+
+# sincos
+Test "sincos (0.7, &sin_res, &cos_res) puts 0.64421768723769105367 in sin_res":
+ildouble: 627
+ldouble: 627
+Test "sincos (0.7, &sin_res, &cos_res) puts 0.76484218728448842626 in cos_res":
+double: 1
+idouble: 1
+ildouble: 528
+ldouble: 528
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+double: 1
+float: 0.5
+idouble: 1
+ifloat: 0.5
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.866025403784438646764 in sin_res":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
+double: 0.2758
+float: 0.3667
+idouble: 0.2758
+ifloat: 0.3667
+ildouble: 0.25
+ldouble: 0.25
+
+# sinh
+Test "sinh (-0) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "sinh (0.7) == 0.75858370183953350346":
+float: 1
+ifloat: 1
+ildouble: 1028
+ldouble: 1029
+
+# sqrt
+Test "sqrt (0.7) == 0.83666002653407554798":
+ildouble: 489
+ldouble: 489
+Test "sqrt (15239.9025) == 123.45":
+ildouble: 325
+ldouble: 325
+
+# tan
+Test "tan (0.7) == 0.84228838046307944813":
+ildouble: 1401
+ldouble: 1401
+Test "tan (pi/4) == 1":
+double: 0.5
+idouble: 0.5
+
+# tanh
+Test "tanh (-0) == -0":
+idouble: 0
+ifloat: 0
+ildouble: 0
+Test "tanh (0.7) == 0.60436777711716349631":
+ildouble: 521
+ldouble: 521
+
+# tgamma
+Test "tgamma (-0.5) == -2 sqrt (pi)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "tgamma (0.5) == sqrt (pi)":
+float: 1
+ifloat: 1
+Test "tgamma (0.7) == 1.29805533264755778568":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y0
+Test "y0 (0.1) == -1.5342386513503668441":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y0 (0.7) == -0.19066492933739506743":
+double: 2
+idouble: 2
+Test "y0 (1.0) == 0.088256964215676957983":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y0 (1.5) == 0.38244892379775884396":
+float: 1
+ifloat: 1
+Test "y0 (10.0) == 0.055671167283599391424":
+float: 1
+ifloat: 1
+Test "y0 (8.0) == 0.22352148938756622053":
+float: 1
+ifloat: 1
+
+# y1
+Test "y1 (0.1) == -6.4589510947020269877":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (0.7) == -1.1032498719076333697":
+double: 1
+idouble: 1
+Test "y1 (1.0) == -0.78121282130028871655":
+double: 1
+idouble: 1
+Test "y1 (1.5) == -0.41230862697391129595":
+float: 1
+ifloat: 1
+Test "y1 (10.0) == 0.24901542420695388392":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+Test "y1 (2.0) == -0.10703243154093754689":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (8.0) == -0.15806046173124749426":
+float: 2
+ifloat: 2
+
+# yn
+Test "yn (0, 0.1) == -1.5342386513503668441":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (0, 0.7) == -0.19066492933739506743":
+double: 2
+idouble: 2
+Test "yn (0, 1.0) == 0.088256964215676957983":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (0, 1.5) == 0.38244892379775884396":
+float: 1
+ifloat: 1
+Test "yn (0, 10.0) == 0.055671167283599391424":
+float: 1
+ifloat: 1
+Test "yn (0, 8.0) == 0.22352148938756622053":
+float: 1
+ifloat: 1
+Test "yn (1, 0.1) == -6.4589510947020269877":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 0.7) == -1.1032498719076333697":
+double: 1
+idouble: 1
+Test "yn (1, 1.0) == -0.78121282130028871655":
+double: 1
+idouble: 1
+Test "yn (1, 1.5) == -0.41230862697391129595":
+float: 1
+ifloat: 1
+Test "yn (1, 10.0) == 0.24901542420695388392":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+Test "yn (1, 2.0) == -0.10703243154093754689":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 8.0) == -0.15806046173124749426":
+float: 2
+ifloat: 2
+Test "yn (10, 0.1) == -0.11831335132045197885e19":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (10, 0.7) == -0.42447194260703866924e10":
+double: 6
+float: 3
+idouble: 6
+ifloat: 3
+Test "yn (10, 1.0) == -0.12161801427868918929e9":
+float: 1
+ifloat: 1
+Test "yn (10, 10.0) == -0.35981415218340272205":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (10, 2.0) == -129184.54220803928264":
+float: 1
+ifloat: 1
+Test "yn (3, 0.1) == -5099.3323786129048894":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 0.7) == -15.819479052819633505":
+double: 2
+idouble: 2
+Test "yn (3, 10.0) == -0.25136265718383732978":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# Maximal error of functions:
+Function: "acos":
+ildouble: 1149
+ldouble: 1149
+
+Function: "asin":
+double: 1
+ildouble: 1147
+ldouble: 1147
+
+Function: "asinh":
+ildouble: 656
+ldouble: 656
+
+Function: "atan":
+ildouble: 549
+ldouble: 549
+
+Function: "atan2":
+ildouble: 549
+ldouble: 549
+
+Function: "atanh":
+double: 1
+idouble: 1
+ildouble: 1605
+ldouble: 1605
+
+Function: "cabs":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 560
+ldouble: 560
+
+Function: Real part of "cacos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 151
+ldouble: 151
+
+Function: Imaginary part of "cacos":
+float: 2
+ifloat: 2
+ildouble: 329
+ldouble: 329
+
+Function: Real part of "cacosh":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+ildouble: 328
+ldouble: 328
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+ildouble: 151
+ldouble: 151
+
+Function: Real part of "casin":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+ildouble: 603
+ldouble: 603
+
+Function: Imaginary part of "casin":
+float: 2
+ifloat: 2
+ildouble: 329
+ldouble: 329
+
+Function: Real part of "casinh":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+ildouble: 892
+ldouble: 892
+
+Function: Imaginary part of "casinh":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+ildouble: 12
+ldouble: 12
+
+Function: Real part of "catan":
+ildouble: 251
+ldouble: 251
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 474
+ldouble: 474
+
+Function: Real part of "catanh":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 66
+ldouble: 66
+
+Function: Imaginary part of "catanh":
+ildouble: 447
+ldouble: 447
+
+Function: "cbrt":
+double: 1
+idouble: 1
+ildouble: 716
+ldouble: 716
+
+Function: Real part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 5
+ldouble: 5
+
+Function: Imaginary part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1901
+ldouble: 1901
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1467
+ldouble: 1467
+
+Function: Imaginary part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1183
+ldouble: 1183
+
+Function: Real part of "cexp":
+float: 1
+ifloat: 1
+ildouble: 940
+ldouble: 940
+
+Function: Imaginary part of "cexp":
+ildouble: 1067
+ldouble: 1067
+
+Function: Real part of "clog":
+
+Function: Imaginary part of "clog":
+ildouble: 1
+ldouble: 1
+
+Function: Real part of "clog10":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 1402
+ldouble: 1402
+
+Function: Imaginary part of "clog10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 186
+ldouble: 186
+
+Function: "cos":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 529
+ldouble: 529
+
+Function: "cosh":
+ildouble: 309
+ldouble: 309
+
+Function: Real part of "cpow":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+
+Function: Imaginary part of "cpow":
+double: 1.104
+float: 2.5333
+idouble: 1.104
+ifloat: 2.5333
+ildouble: 2
+ldouble: 2
+
+Function: Real part of "csin":
+ildouble: 966
+ldouble: 966
+
+Function: Imaginary part of "csin":
+ildouble: 168
+ldouble: 168
+
+Function: Real part of "csinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 413
+ldouble: 413
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 477
+ldouble: 477
+
+Function: Real part of "csqrt":
+double: 1
+idouble: 1
+ildouble: 237
+ldouble: 237
+
+Function: Imaginary part of "csqrt":
+ildouble: 128
+ldouble: 128
+
+Function: Real part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 690
+ldouble: 690
+
+Function: Imaginary part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 367
+ldouble: 367
+
+Function: Real part of "ctanh":
+float: 1
+ifloat: 1
+ildouble: 286
+ldouble: 286
+
+Function: Imaginary part of "ctanh":
+double: 1
+idouble: 1
+ildouble: 3074
+ldouble: 3074
+
+Function: "erfc":
+double: 24
+float: 12
+idouble: 24
+ifloat: 12
+
+Function: "exp":
+ildouble: 412
+ldouble: 412
+
+Function: "exp10":
+double: 1
+idouble: 1
+ildouble: 1182
+ldouble: 1182
+
+Function: "exp2":
+ildouble: 462
+ldouble: 462
+
+Function: "expm1":
+ildouble: 825
+ldouble: 825
+
+Function: "fmod":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 4096
+ldouble: 4096
+
+Function: "hypot":
+double: 1
+float: 1
+ildouble: 560
+ldouble: 560
+
+Function: "j0":
+float: 1
+ifloat: 1
+
+Function: "j1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "jn":
+double: 4
+float: 2
+idouble: 4
+ifloat: 2
+
+Function: "lgamma":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "log":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 2341
+ldouble: 2341
+
+Function: "log10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 2033
+ldouble: 2033
+
+Function: "log1p":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 585
+ldouble: 585
+
+Function: "log2":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1688
+ldouble: 1688
+
+Function: "pow":
+ildouble: 725
+ldouble: 725
+
+Function: "sin":
+ildouble: 627
+ldouble: 627
+
+Function: "sincos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 627
+ldouble: 627
+
+Function: "sinh":
+float: 1
+ifloat: 1
+ildouble: 1028
+ldouble: 1029
+
+Function: "sqrt":
+ildouble: 489
+ldouble: 489
+
+Function: "tan":
+double: 0.5
+idouble: 0.5
+ildouble: 1401
+ldouble: 1401
+
+Function: "tanh":
+ildouble: 521
+ldouble: 521
+
+Function: "tgamma":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "y0":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "y1":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "yn":
+double: 6
+float: 3
+idouble: 6
+ifloat: 3
+
+# end of automatic generation
diff --git a/sysdeps/i386/fpu/s_log1p.S b/sysdeps/i386/fpu/s_log1p.S
index 10e8a36369..d3bc3d7251 100644
--- a/sysdeps/i386/fpu/s_log1p.S
+++ b/sysdeps/i386/fpu/s_log1p.S
@@ -36,8 +36,12 @@ ENTRY(__log1p)
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
+ fxam
+ fnstsw
fld %st
- fabs
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fabs
#ifdef PIC
fcompl limit@GOTOFF(%edx)
#else
@@ -58,5 +62,10 @@ ENTRY(__log1p)
2: fyl2xp1
ret
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+
END (__log1p)
weak_alias (__log1p, log1p)
diff --git a/sysdeps/i386/fpu/s_log1pf.S b/sysdeps/i386/fpu/s_log1pf.S
index df9fdcbcfc..d5283fcfee 100644
--- a/sysdeps/i386/fpu/s_log1pf.S
+++ b/sysdeps/i386/fpu/s_log1pf.S
@@ -36,8 +36,12 @@ ENTRY(__log1pf)
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
+ fxam
+ fnstsw
fld %st
- fabs
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fabs
#ifdef PIC
fcomps limit@GOTOFF(%edx)
#else
@@ -58,5 +62,10 @@ ENTRY(__log1pf)
2: fyl2xp1
ret
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+
END (__log1pf)
weak_alias (__log1pf, log1pf)
diff --git a/sysdeps/i386/fpu/s_log1pl.S b/sysdeps/i386/fpu/s_log1pl.S
index 05a17b2831..26c407b606 100644
--- a/sysdeps/i386/fpu/s_log1pl.S
+++ b/sysdeps/i386/fpu/s_log1pl.S
@@ -41,7 +41,12 @@ ENTRY(__log1pl)
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
+ fxam
+ fnstsw
fld %st
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4:
fabs
#ifdef PIC
fldt limit@GOTOFF(%edx)
@@ -64,5 +69,10 @@ ENTRY(__log1pl)
2: fyl2xp1
ret
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+
END (__log1pl)
weak_alias (__log1pl, log1pl)
diff --git a/sysdeps/i386/fpu/s_log2.S b/sysdeps/i386/fpu/s_log2.S
index 4632c96f67..5ba40761e9 100644
--- a/sysdeps/i386/fpu/s_log2.S
+++ b/sysdeps/i386/fpu/s_log2.S
@@ -40,8 +40,12 @@ ENTRY(__log2)
#endif
fldl MO(one)
fldl 4(%esp) // x : 1
+ fxam
+ fnstsw
fld %st // x : x : 1
- fsub %st(2), %st // x-1 : x : 1
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fsub %st(2), %st // x-1 : x : 1
fld %st // x-1 : x-1 : x : 1
fabs // |x-1| : x-1 : x : 1
fcompl MO(limit) // x-1 : x : 1
@@ -55,5 +59,10 @@ ENTRY(__log2)
2: fstp %st(0) // x : 1
fyl2x // log(x)
ret
+
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
END (__log2)
weak_alias (__log2, log2)
diff --git a/sysdeps/i386/fpu/s_log2f.S b/sysdeps/i386/fpu/s_log2f.S
index bfdd0ef88e..111dc9c1d9 100644
--- a/sysdeps/i386/fpu/s_log2f.S
+++ b/sysdeps/i386/fpu/s_log2f.S
@@ -40,8 +40,12 @@ ENTRY(__log2f)
#endif
fldl MO(one)
flds 4(%esp) // x : 1
+ fxam
+ fnstsw
fld %st // x : x : 1
- fsub %st(2), %st // x-1 : x : 1
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fsub %st(2), %st // x-1 : x : 1
fld %st // x-1 : x-1 : x : 1
fabs // |x-1| : x-1 : x : 1
fcompl MO(limit) // x-1 : x : 1
@@ -55,5 +59,10 @@ ENTRY(__log2f)
2: fstp %st(0) // x : 1
fyl2x // log(x)
ret
+
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
END (__log2f)
weak_alias (__log2f, log2f)
diff --git a/sysdeps/i386/fpu/s_log2l.S b/sysdeps/i386/fpu/s_log2l.S
index 184981c4bb..7b645d57ab 100644
--- a/sysdeps/i386/fpu/s_log2l.S
+++ b/sysdeps/i386/fpu/s_log2l.S
@@ -40,8 +40,12 @@ ENTRY(__log2l)
#endif
fldl MO(one)
fldt 4(%esp) // x : 1
+ fxam
+ fnstsw
fld %st // x : x : 1
- fsub %st(2), %st // x-1 : x : 1
+ sahf
+ jc 3f // in case x is NaN or ħInf
+4: fsub %st(2), %st // x-1 : x : 1
fld %st // x-1 : x-1 : x : 1
fabs // |x-1| : x-1 : x : 1
fcompl MO(limit) // x-1 : x : 1
@@ -55,5 +59,10 @@ ENTRY(__log2l)
2: fstp %st(0) // x : 1
fyl2x // log(x)
ret
+
+3: jp 4b // in case x is ħInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
END (__log2l)
weak_alias (__log2l, log2l)