diff options
-rw-r--r-- | ChangeLog | 64 | ||||
-rw-r--r-- | linuxthreads/ChangeLog | 11 | ||||
-rw-r--r-- | linuxthreads/pthread.c | 61 | ||||
-rw-r--r-- | linuxthreads/signals.c | 12 | ||||
-rw-r--r-- | math/libm-test.inc | 66 | ||||
-rw-r--r-- | math/math.h | 40 | ||||
-rw-r--r-- | sysdeps/i386/fpu/bits/mathinline.h | 19 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atanh.S | 15 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atanhf.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atanhl.S | 16 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_log10.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_log10f.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_log10l.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/libm-test-ulps | 1428 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log1p.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log1pf.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log1pl.S | 10 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log2.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log2f.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log2l.S | 11 |
20 files changed, 1770 insertions, 71 deletions
@@ -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) |