mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-23 15:01:03 +03:00
Update.
1997-03-20 01:49 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_tanhl.c (__tanhl): Correct handling of -inf. * Makeconfig: (rpath-link): Add math/ directory. (math-objdir): New variable. (link-extra-lib): Define to special version when $(common-objpfx)!=$(objpfx) to allow libraries outside $(common-objpfx) be linked to the application. * math/Makefile: Add rules to build and run test programs. * math/libm-test.c (_GNU_SOURCE): Define only if still undefined. (check_equal): Correct check for error. (ceil_test): Fix typo. (log_test): Fix typo. (floor_test): Fix typo. (pow_test): Fix typos. (log10_test): Allow slight incorrectness for `log10(e)'. (modf_test): New functions to test `modf' et.al. (hypot_test): Rewrite test completely. Patch partly by Andreas Jaeger. * math/test-double.h (__NO_MATH_INLINES): Define only if not already defined. * math/test-float.h: Likewise. * math/test-logdouble.h: Likewise. * setjmp/setjmp.h: Change references of ANSI C to ISO C. * setjmp/tst-setjmp.c: Correct and extend test suite. * sysdeps/i386/__longjmp.S: Update copyright. * sysdeps/i386/bsd-_setjmp.S: Correct fatal bug in jump to `__sigsetjmp' in PIC code. * sysdeps/i386/bsd-setjmp.S: Likewise. * sysdeps/libm-i387/e_pow.S: Correct recognition of mantissa overflow. * sysdeps/libm-i387/e_powf.S: Likewise. * sysdeps/libm-i387/s_expm1.S: Handle x == +-0 as a special case since expm1(-0) == -0. * sysdeps/libm-i387/s_expm1f.S: Likewise. * sysdeps/libm-i387/s_expm1l.S: Likewise. * sysdeps/libm-ieee754/s_modf.c: Optimize code by avoiding unneeded access to FP number. * sysdeps/libm-ieee754/s_modff.c: Likewise. * sysdeps/libm-ieee754/s_modfl.c: Correct former completely bogus code. It never worked correctly. * sysdeps/libm-ieee754/s_tanh.c: Handle x == +-0 as a special case since tanh(-0) == -0. * sysdeps/libm-ieee754/s_tanhf.c: Likewise. 1997-03-19 21:13 Ulrich Drepper <drepper@cygnus.com> * stdlib/strtod.c (STRTOL): Use wchar_t as type for `decimal' and `thousands' to support systems with sizeof(wchar_t) != sizeof(wint_t). Blargh. * sysdeps/unix/sysv/linux/socketbits.h: Remove definition of SOL_IP, SOL_TCP, SOL_UDP, and SOL_IPX as they are defined in appropriate headers. * sysdeps/unix/sysv/linux/writev.c: Don't use MAX_IOVEC. Test for UIO_FASTIOV and set to 8 if not available. * sysdeps/unix/sysv/linux/readv.c: Likewise. Patch by HJ Lu. * sysdeps/unix/sysv/linux/xstat.c: Include <kernel_stat.h>, not "kernel_stat.h". * sysdeps/unix/sysv/linux/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/fxstat.c: Likewise. Reported by fabsoft@fabsoft2.zarm.uni-bremen.de.
This commit is contained in:
124
math/libm-test.c
124
math/libm-test.c
@ -41,9 +41,9 @@
|
||||
/* This program isn't finished yet.
|
||||
It has tests for acos, acosh, asin, asinh, atan, atan2, atanh,
|
||||
cbrt, ceil, cos, cosh, exp, exp2, expm1, fabs, floor, fpclassify,
|
||||
frexp, ldexp,
|
||||
log, log10, log1p, log2, logb,
|
||||
pow, sin, sinh, tan, tanh, fabs, hypot.
|
||||
frexp, hypot, ldexp,
|
||||
log, log10, log1p, log2, logb, modf,
|
||||
pow, sin, sinh, tan, tanh.
|
||||
Tests for the other libm-functions will come later.
|
||||
|
||||
The routines using random variables are still under construction. I don't
|
||||
@ -66,7 +66,9 @@
|
||||
log2. */
|
||||
#undef ISO_9X_IMPLEMENTED
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
@ -192,7 +194,7 @@ check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff
|
||||
|
||||
*diff = FUNC(fabs) (computed - supplied);
|
||||
|
||||
if (*diff <= eps || signbit (computed) != signbit (supplied))
|
||||
if (*diff <= eps && (signbit (computed) == signbit (supplied) || eps != 0.0))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@ -211,7 +213,7 @@ output_result_bool (const char *test_name, int result)
|
||||
{
|
||||
if (verbose)
|
||||
printf ("Fail: %s\n", test_name);
|
||||
noErrors++;
|
||||
++noErrors;
|
||||
}
|
||||
|
||||
fpstack_test (test_name);
|
||||
@ -592,7 +594,7 @@ ceil_test (void)
|
||||
check_isinfn ("ceil (-inf) == -inf", FUNC(ceil) (minus_infty));
|
||||
|
||||
check ("ceil (pi) == 4", FUNC(ceil) (M_PI), 4.0);
|
||||
check ("ceil (-pi) == -3", FUNC(ceil) (-M_PI), 3.0);
|
||||
check ("ceil (-pi) == -3", FUNC(ceil) (-M_PI), -3.0);
|
||||
}
|
||||
|
||||
|
||||
@ -802,7 +804,7 @@ log_test (void)
|
||||
check_isinfp ("log (+inf) == +inf", FUNC(log) (plus_infty));
|
||||
|
||||
check_eps ("log (e) == 1", FUNC(log) (M_E), 1, CHOOSE (0, 0, 9e-8L));
|
||||
check ("log (1/e) == -1", FUNC(log) (1.0 / M_E), 1);
|
||||
check ("log (1/e) == -1", FUNC(log) (1.0 / M_E), -1);
|
||||
check ("log (2) == M_LN2", FUNC(log) (2), M_LN2);
|
||||
check ("log (10) == M_LN10", FUNC(log) (10), M_LN10);
|
||||
}
|
||||
@ -828,7 +830,7 @@ log10_test (void)
|
||||
check ("log10 (100) == 2", FUNC(log10) (100.0), 2);
|
||||
check ("log10 (10000) == 4", FUNC(log10) (10000.0), 4);
|
||||
check_eps ("log10 (e) == M_LOG10E", FUNC(log10) (M_E), M_LOG10E,
|
||||
CHOOSE (0, 0, 9e-8));
|
||||
CHOOSE (9e-20, 0, 9e-8));
|
||||
}
|
||||
|
||||
|
||||
@ -895,6 +897,42 @@ logb_test (void)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
modf_test (void)
|
||||
{
|
||||
MATHTYPE result, intpart;
|
||||
|
||||
result = FUNC(modf) (plus_infty, &intpart);
|
||||
check ("modf (+inf, &x) returns +0", result, 0);
|
||||
check_isinfp ("modf (+inf, &x) set x to +inf", intpart);
|
||||
|
||||
result = FUNC(modf) (minus_infty, &intpart);
|
||||
check ("modf (-inf, &x) returns -0", result, minus_zero);
|
||||
check_isinfn ("modf (-inf, &x) sets x to -inf", intpart);
|
||||
|
||||
result = FUNC(modf) (nan_value, &intpart);
|
||||
check_isnan ("modf (NaN, &x) returns NaN", result);
|
||||
check_isnan ("modf (-inf, &x) sets x to NaN", intpart);
|
||||
|
||||
result = FUNC(modf) (0, &intpart);
|
||||
check ("modf (0, &x) returns 0", result, 0);
|
||||
check ("modf (0, &x) sets x to 0", intpart, 0);
|
||||
|
||||
result = FUNC(modf) (minus_zero, &intpart);
|
||||
check ("modf (-0, &x) returns -0", result, minus_zero);
|
||||
check ("modf (-0, &x) sets x to -0", intpart, minus_zero);
|
||||
|
||||
result = FUNC(modf) (2.5, &intpart);
|
||||
check ("modf (2.5, &x) returns 0.5", result, 0.5);
|
||||
check ("modf (2.5, &x) sets x to 2", intpart, 2);
|
||||
|
||||
result = FUNC(modf) (-2.5, &intpart);
|
||||
check ("modf (-2.5, &x) returns -0.5", result, -0.5);
|
||||
check ("modf (-2.5, &x) sets x to -2", intpart, -2);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sin_test (void)
|
||||
{
|
||||
@ -971,58 +1009,33 @@ floor_test (void)
|
||||
check_isinfn ("floor (-inf) == -inf", FUNC(floor) (minus_infty));
|
||||
|
||||
check ("floor (pi) == 3", FUNC(floor) (M_PI), 3.0);
|
||||
check ("floor (-pi) == -4", FUNC(floor) (-M_PI), 4.0);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
hypot_report (const char *test_name, MATHTYPE computed, MATHTYPE expected)
|
||||
{
|
||||
MATHTYPE diff;
|
||||
int result;
|
||||
|
||||
result = check_equal (computed, expected, 0, &diff);
|
||||
|
||||
if (result)
|
||||
{
|
||||
if (verbose > 2)
|
||||
printf ("Pass: %s\n", test_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (verbose)
|
||||
printf ("Fail: %s\n", test_name);
|
||||
if (verbose > 1)
|
||||
{
|
||||
printf ("Result:\n");
|
||||
printf (" is: %.20" PRINTF_EXPR, computed);
|
||||
printf (" should be: %.20" PRINTF_EXPR, expected);
|
||||
printf (" difference: %.20" PRINTF_EXPR "\n", diff);
|
||||
}
|
||||
noErrors++;
|
||||
}
|
||||
fpstack_test (test_name);
|
||||
output_result (test_name, result,
|
||||
computed, expected, diff, PRINT, PRINT);
|
||||
check ("floor (-pi) == -4", FUNC(floor) (-M_PI), -4.0);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
hypot_test (void)
|
||||
{
|
||||
MATHTYPE a = FUNC(hypot) (12.4L, 0.7L);
|
||||
MATHTYPE a;
|
||||
|
||||
hypot_report ("hypot (x,y) == hypot (y,x)", FUNC(hypot) (0.7L, 12.4L), a);
|
||||
hypot_report ("hypot (x,y) == hypot (-x,y)", FUNC(hypot) (-12.4L, 0.7L), a);
|
||||
hypot_report ("hypot (x,y) == hypot (-y,x)", FUNC(hypot) (-0.7L, 12.4L), a);
|
||||
hypot_report ("hypot (x,y) == hypot (-x,-y)", FUNC(hypot) (-12.4L, -0.7L), a);
|
||||
hypot_report ("hypot (x,y) == hypot (-y,-x)", FUNC(hypot) (-0.7L, -12.4L), a);
|
||||
a = random_greater (0);
|
||||
check_isinfp_ext ("hypot (+inf, x) == +inf", FUNC(hypot) (plus_infty, a), a);
|
||||
check_isinfp_ext ("hypot (-inf, x) == +inf", FUNC(hypot) (minus_infty, a), a);
|
||||
|
||||
check_isnan ("hypot (NaN, NaN) == NaN", FUNC(hypot) (nan_value, nan_value));
|
||||
|
||||
a = FUNC(hypot) (12.4L, 0.7L);
|
||||
check ("hypot (x,y) == hypot (y,x)", FUNC(hypot) (0.7L, 12.4L), a);
|
||||
check ("hypot (x,y) == hypot (-x,y)", FUNC(hypot) (-12.4L, 0.7L), a);
|
||||
check ("hypot (x,y) == hypot (-y,x)", FUNC(hypot) (-0.7L, 12.4L), a);
|
||||
check ("hypot (x,y) == hypot (-x,-y)", FUNC(hypot) (-12.4L, -0.7L), a);
|
||||
check ("hypot (x,y) == hypot (-y,-x)", FUNC(hypot) (-0.7L, -12.4L), a);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-0.7L, 0), 0.7L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (0.7L, 0), 0.7L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-1.0L, 0), 1.0L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-1.0L, 0), 1.0L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-5.7e7L, 0), 5.7e7L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (1.0L, 0), 1.0L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-5.7e7L, 0), 5.7e7L);
|
||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (5.7e7L, 0), 5.7e7L);
|
||||
}
|
||||
|
||||
|
||||
@ -1084,9 +1097,9 @@ pow_test (void)
|
||||
check_isinfp ("pow (-inf, 11.1) == +inf", FUNC(pow) (minus_infty, 11.1));
|
||||
check_isinfp ("pow (-inf, 1001.1) == +inf", FUNC(pow) (minus_infty, 1001.1));
|
||||
|
||||
check ("pow (-inf, -1) == -0", FUNC(pow) (-minus_infty, -1), minus_zero);
|
||||
check ("pow (-inf, -11) == -0", FUNC(pow) (-minus_infty, -11), minus_zero);
|
||||
check ("pow (-inf, -1001) == -0", FUNC(pow) (-minus_infty, -1001), minus_zero);
|
||||
check ("pow (-inf, -1) == -0", FUNC(pow) (minus_infty, -1), minus_zero);
|
||||
check ("pow (-inf, -11) == -0", FUNC(pow) (minus_infty, -11), minus_zero);
|
||||
check ("pow (-inf, -1001) == -0", FUNC(pow) (minus_infty, -1001), minus_zero);
|
||||
|
||||
check ("pow (-inf, -2) == +0", FUNC(pow) (minus_infty, -2), 0);
|
||||
check ("pow (-inf, -12) == +0", FUNC(pow) (minus_infty, -12), 0);
|
||||
@ -1189,8 +1202,8 @@ pow_test (void)
|
||||
FUNC(pow) (minus_infty, x), minus_zero, x);
|
||||
|
||||
x = ((rand () % 1000000) + 1) * -2.0; /* Get random even integer < 0 */
|
||||
check_ext ("pow (-inf, y) == -0 for y < 0 and not an odd integer",
|
||||
FUNC(pow) (minus_infty, x), minus_zero, x);
|
||||
check_ext ("pow (-inf, y) == 0 for y < 0 and not an odd integer",
|
||||
FUNC(pow) (minus_infty, x), 0.0, x);
|
||||
|
||||
x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */
|
||||
check_ext ("pow (+0, y) == +0 for y an odd integer > 0",
|
||||
@ -1497,6 +1510,7 @@ main (int argc, char *argv[])
|
||||
log2_test ();
|
||||
#endif
|
||||
logb_test ();
|
||||
modf_test ();
|
||||
sin_test ();
|
||||
sinh_test ();
|
||||
tan_test ();
|
||||
|
Reference in New Issue
Block a user