diff options
| author | Ulrich Drepper <drepper@redhat.com> | 1997-05-29 12:06:58 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 1997-05-29 12:06:58 +0000 |
| commit | 76b87c039ba8d20add4f52ba43f3471fd92e210b (patch) | |
| tree | 08c6a1bc32f699056a97f2683bc859cb0d7f6871 /math | |
| parent | 06bdbaa0a614c256b34214fde7c395f9e0a6206c (diff) | |
| download | glibc-76b87c039ba8d20add4f52ba43f3471fd92e210b.tar.xz glibc-76b87c039ba8d20add4f52ba43f3471fd92e210b.zip | |
Update.
1997-05-29 12:48 Ulrich Drepper <drepper@cygnus.com>
* io/ftw.c: Complete rewrite. Add implementation of `nftw'.
* io/ftw.h: Update for new implementation and XPG4.2.
* login/Makefile: Update for UTMP daemon implementation.
Update resolver code to bind-4.9.6-T1A.
* resolv/Banner: Update.
* nss/digits_dots.c: Adapt text address matching to T1A.
* nss/nss_files/files-hosts.c: Always use inet_pton.
* resolv/base64.c (b64_pton): Follow T1A but don't use this code since
it would lead to warnings.
* resolv/gethnamaddr.c (getanswer): Test host name for maximal length
at several places.
* resolv/inet_net_pton.c (inet_net_pton_ipv4): Correct typo in comment.
* resolv/res_comp.c (dn_expand): Check for overflow.
(dn_comp): Likewise.
* resolv/res_debug.c (precsize_aton): Better implementation.
* resolv/res_init.c (res_init): Make `buf' of size MAXDNAME.
* resolv/res_send.c (res_send): Check for overflow in descriptor set.
* resolv/nss_dns/dns-host.c (getanswer_r): Test host name for maximal
length at several places.
1997-05-29 12:51 Mark Kettenis <kettenis@phys.uva.nl>
* login/utmp-private.h (struct utfuncs): Add one more parameter
to updwtmp function.
Declare all three function jump tables.
* login/utmp.h: Declare __utmpname.
* login/getutent_r.c: Remove db backend and provide support for
utmpd backend.
* login/login.c: Use `updwtmp' function insteead of writing the
record ourself.
* login/logwtmp.c: Move `updwtmp' function to...
* login/updwtmp.c: ...here. New file.
* login/utmp_db.h: Removed.
* login/utmp_file.c: Add updwtmp function to write to file.
* login/utmp_daemon.c: New file. Daemon backend.
* login/utmpname.c: New file. Implementation of utmpname function.
* login/utmpdump.c: New file. Tool to dump utmp-like files.
* login/utmpd/connection.c: New file.
* login/utmpd/database.c: New file.
* login/utmpd/error.c: New file.
* login/utmpd/request.c: New file.
* login/utmpd/utmpd-private.h: New file.
* login/utmpd/utmpd.c: New file.
* login/utmpd/utmpd.h: New file.
* login/utmpd/xtmp.c: New file.
* login/utmpd/xtmp.h: New file.
1997-05-29 12:28 Jim Meyering <meyering@eng.ascend.com>
* time/strftime.c: Correct/normalize indentation in cpp directives.
1997-05-28 20:43 Philip Blundell <pjb27@cam.ac.uk>
* nis/nis_error.c: Include <string.h> to fix warning.
* nis/nis_print.c: Likewise.
* nis/nss_nisplus/nisplus-hosts.c: Arg 3 of map_v4v6_hostent
is int* not size_t*.
1997-05-28 21:56 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* math/cmathcalls.h: Correct typo in comment.
* inet/netinet/icmp6.h: Include <netinet/in.h> for in6_addr.
* sysdeps/unix/sysv/linux/netinet/ip_fw.h: Include <net/if.h> for
IFNAMSIZ.
* sysdeps/unix/sysv/linux/net/ppp_defs.h: Include <time.h> for
time_t.
* login/pty.h: Include <ioctl-types.h> for definition of struct
winsize.
* misc/regexp.h (compile): Correct typo.
* argp/argp.h: Put extern before __const in defintion of
argp_program_bug_address.
1997-05-29 00:20 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/wordsize-32/inttypes.h: Correct names of unsigned fast
and least types. Correct names of ?INT_FAST*_{MIN,MAX} macros.
* sysdeps/wordsize-64/inttypes.h: Likewise.
Reported by Andreas Jaeger <aj@arthur.rhein-neckar.de>.
1997-05-28 22:51 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/Makefile (make-ioctls-CFLAGS): Use generic
ttydefaults.h file instead of non-existing version in termios/sys.
Reported by Zack Weinberg <zack@rabi.phys.columbia.edu>.
* time/strptime.c (strptime_internal, case 'Y'): Restrict year
number to four digits and to representable range for 4 byte time_t
values.
Patch by H.J. Lu <hjl@lucon.org>.
1997-05-28 18:19 Philip Blundell <pjb27@cam.ac.uk>
* posix/execl.c: Include <alloca.h> to avoid warning.
1997-05-27 18:19 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* math/libm-test.c: Implement testing of inlined functions, make
output nicer, update comments.
* math/test-idouble.c: New file. Frontend for double tests of
inlined functions.
* math/test-ildoubl.c: New file. Frontend for long double tests of
inlined functions.
* math/test-ifloat.c: New file. Frontend for float tests of
inlined functions.
* math/test-longdouble.c: Rename to...
* math/test-ldouble.c: ...this.
* math/Makefile: Add rules for new test programs, change rules for
renaming of longdouble test.
1997-05-20 15:50 H.J. Lu <hjl@gnu.ai.mit.edu>
* sunrpc/rpc/svc.h (__dispatch_fn_t): New.
(svc_register): Use __dispatch_fn_t in prototype.
1997-05-28 17:02 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/generic/bzero.c (bzero): Fix typo.
Patch by Witek Wnuk <spider@pest.waw.ids.edu.pl>.
1997-05-27 12:00 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* sysdeps/generic/vtimes.c: Use ISO C declaration style.
* sysdeps/unix/bsd/ualarm.c: Include <unistd.h> for prototype.
* sysdeps/generic/memccpy.c: Include <string.h> for prototype.
* signal/tst-signal.c (handler): Correct function declaration to
avoid warning.
* stdlib/testsort.c (compare): Likewise.
* string/tester.c: Likewise.
1997-05-27 14:16 Miles Bader <miles@gnu.ai.mit.edu>
* argp-help.c (argp_args_usage): Supply correct argp to filter_doc.
1997-05-27 17:51 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* db/hash/extern.h, db/hash/hash.c, db/hash/hash.h,
db/hash/hash_log2.c: Rename __log2 to __hash_log2 to avoid clash
with libm.
1997-05-27 14:47 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/e_atan2.c: Fix missing negate. Use __m81_test
instead of explicit comparisons.
1997-05-26 18:36 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* inet/netinet/icmp6.h: Remove use of <asm/bitops.h> which has no
place in a generic header and is no user include file.
Diffstat (limited to 'math')
| -rw-r--r-- | math/Makefile | 12 | ||||
| -rw-r--r-- | math/cmathcalls.h | 2 | ||||
| -rw-r--r-- | math/libm-test.c | 307 | ||||
| -rw-r--r-- | math/test-idouble.c | 33 | ||||
| -rw-r--r-- | math/test-ifloat.c | 32 | ||||
| -rw-r--r-- | math/test-ildoubl.c | 33 | ||||
| -rw-r--r-- | math/test-ldouble.c (renamed from math/test-longdouble.c) | 0 |
7 files changed, 344 insertions, 75 deletions
diff --git a/math/Makefile b/math/Makefile index c2f3274877..e0c295b123 100644 --- a/math/Makefile +++ b/math/Makefile @@ -74,19 +74,23 @@ long-c-yes = $(calls:=l) distribute += $(long-c-yes:=.c) # Rules for the test suite. -tests = test-float test-double $(test-longdouble-$(long-double-fcts)) +tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \ + test-ifloat test-idouble # We do the `long double' tests only if this data type is available and # distrinct from `double'. # # XXX This test is disabled for now since the functions are too buggy. -#test-longdouble-yes = test-longdouble +#test-longdouble-yes = test-ldouble test-ildoubl CFLAGS-test-float.c = -fno-inline CFLAGS-test-double.c = -fno-inline -CFLAGS-test-longdouble.c = -fno-inline +CFLAGS-test-ldouble.c = -fno-inline +LDLIBS-test-ifloat = libm +LDLIBS-test-idouble = libm +LDLIBS-test-ildoubl = libm LDLIBS-test-float = libm LDLIBS-test-double = libm -LDLIBS-test-longdouble = libm +LDLIBS-test-ldouble = libm distribute += libm-test.c diff --git a/math/cmathcalls.h b/math/cmathcalls.h index 73a1c2a5da..1f74f56e0b 100644 --- a/math/cmathcalls.h +++ b/math/cmathcalls.h @@ -18,7 +18,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* NOTE: Because of the special way this file is used by <math.h>, this +/* NOTE: Because of the special way this file is used by <complex.h>, this file must NOT be protected from multiple inclusion as header files usually are. diff --git a/math/libm-test.c b/math/libm-test.c index 1f64d1ad24..866313e963 100644 --- a/math/libm-test.c +++ b/math/libm-test.c @@ -1,6 +1,6 @@ /* Copyright (C) 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Andreas Jaeger <aj@arthur.pfalz.de>, 1997. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1997. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -39,30 +39,67 @@ */ /* This program isn't finished yet. - It has tests for acos, acosh, asin, asinh, atan, atan2, atanh, + It has tests for: + acos, acosh, asin, asinh, atan, atan2, atanh, cbrt, ceil, copysign, cos, cosh, exp, exp2, expm1, fabs, fdim, floor, fmin, fmax, fpclassify, frexp, hypot, ilogb, ldexp, log, log10, log1p, log2, logb, modf, nextafter, - pow, scalb, scalbn, sin, sinh, sqrt, tan, tanh, trunc. - Tests for the other libm-functions will come later. + pow, rint, rinttol, rinttoll, round, roundtol, roundtoll, + scalb, scalbn, sin, sinh, sqrt, tan, tanh, trunc + + and for the following complex math functions: + cacos, cacosh, casin, casinh, catan, catanh, + ccos, ccosh, cexp, clog, cpow, csin, csinh, csqrt, ctanh. + + At the moment the following functions aren't tested: + cabs, carg, conj, cproj, cimag, creal, drem, + erf, erfc, gamma, lgamma, + j0, j1, jn, y0, y1, yn, + nearbyint, remainder, remquo, signbit, significant, sincos. The routines using random variables are still under construction. I don't like it the way it's working now and will change it. - Exception handling has not been implemented so far so don't get fooled - that these tests pass. - Parameter handling is primitive in the moment: - --verbose=[0..3] for different levels of output: + --verbose=[0..4] for different levels of output: 0: only error count - 1: basic report on failed tests + 1: basic report on failed tests (default) 2: full report on failed tests - 3: full report on failed and passed tests (default) - -v for full output (equals --verbose=3) + 3: full report on failed and passed tests + 4: additional report on exceptions + -v for full output (equals --verbose=4) -s,--silent outputs only the error count (equals --verbose=0) */ +/* "Philosophy": + + This suite tests the correct implementation of mathematical + functions in libm. Some simple, specific parameters are tested for + correctness. Handling of specific inputs (e.g. infinity, + not-a-number) is also tested. Correct handling of exceptions is + checked against. These implemented tests should check all cases + that are specified in ISO C 9X. + + Inline functions: Inlining functions should give an improvement in + speed - but not in precission. The inlined functions return + reasonable values for a reasonable range of input values. The + result is not necessarily correct for all values and exceptions are + not correctly raised in all cases. Problematic input and return + values are infinity, not-a-number and minus zero. This suite + therefore does not check these specific inputs and the exception + handling for inlined mathematical functions - just the "reasonable" + values are checked. + + Beware: The tests might fail for any of the following reasons: + - Tests are wrong + - Functions are wrong + - Floating Point Unit not working properly + - Compiler has errors + + With e.g. gcc 2.7.2.2 the test for cexp fails because of a compiler error. +*/ + #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif @@ -75,11 +112,8 @@ #include <errno.h> #include <stdlib.h> #include <stdio.h> -#include <time.h> #include <getopt.h> -/* TEST_EXCEPTION: tests if an exception as occured */ -/* for the moment: does nothing */ /* Possible exceptions */ #define NO_EXCEPTION 0x0 #define INVALID_EXCEPTION 0x1 @@ -167,11 +201,39 @@ random_greater (MATHTYPE min_value) } /* Get a random value x with x < max_value. */ +#ifndef TEST_INLINE static MATHTYPE random_less (MATHTYPE max_value) { return random_value (-1e6, max_value); } +#endif + + +static void +output_new_test (const char *test_name) +{ + if (verbose > 2) + printf ("\nTesting: %s\n", test_name); +} + + +static void +output_pass_value (void) +{ + if (verbose > 2) + printf ("Pass: Value Ok.\n"); +} + + +static void +output_fail_value (const char * test_name) +{ + if (verbose > 0 && verbose < 3) + printf ("Fail: %s\n", test_name); + if (verbose >= 3) + printf ("Fail:\n"); +} /* Test whether a given exception was raised. */ @@ -182,18 +244,22 @@ test_single_exception (const char *test_name, fexcept_t fe_flag, const char *flag_name) { +#ifndef TEST_INLINE if (exception & exc_flag) { if (fetestexcept (fe_flag)) { - if (verbose > 2) - printf ("Pass: %s:\nException \"%s\" set\n", test_name, flag_name); + if (verbose > 3) + printf ("Pass: Exception \"%s\" set\n", flag_name); } else { - if (verbose) - printf ("Fail: %s:\nException \"%s\" not set\n", + if (verbose && verbose < 3) + printf ("Fail: %s: Exception \"%s\" not set\n", test_name, flag_name); + if (verbose >= 3) + printf ("Fail: Exception \"%s\" not set\n", + flag_name); ++noErrors; } } @@ -201,18 +267,22 @@ test_single_exception (const char *test_name, { if (fetestexcept (fe_flag)) { - if (verbose) - printf ("Fail: %s:\nException \"%s\" set\n", + if (verbose && verbose < 3) + printf ("Fail: %s: Exception \"%s\" set\n", test_name, flag_name); + if (verbose >= 3) + printf ("Fail: Exception \"%s\" set\n", + flag_name); ++noErrors; } else { - if (verbose > 2) - printf ("Pass: %s:\nException \"%s\" not set\n", - test_name, flag_name); + if (verbose > 3) + printf ("Pass: Exception \"%s\" not set\n", + flag_name); } } +#endif } @@ -256,6 +326,8 @@ test_exceptions (const char *test_name, short int exception) static int check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff) { + int ret_value; + /* Both plus Infinity or both minus infinity. */ if (ISINF (computed) && (ISINF (computed) == ISINF (supplied))) return 1; @@ -265,25 +337,28 @@ check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff *diff = FUNC(fabs) (computed - supplied); - if (*diff <= eps && (signbit (computed) == signbit (supplied) || eps != 0.0)) - return 1; - return 0; + ret_value = (*diff <= eps && + (signbit (computed) == signbit (supplied) || eps != 0.0)); + + /* Make sure the subtraction/comparsion have no influence on the exceptions. */ + feclearexcept (FE_ALL_EXCEPT); + + return ret_value; } + static void output_result_bool (const char *test_name, int result) { if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); ++noErrors; } @@ -297,13 +372,11 @@ output_isvalue (const char *test_name, int result, { if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); if (verbose > 1) printf (" Value: %.20" PRINTF_EXPR "\n", value); noErrors++; @@ -319,13 +392,11 @@ output_isvalue_ext (const char *test_name, int result, { if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); if (verbose > 1) { printf (" Value: %.20" PRINTF_EXPR "\n", value); @@ -346,13 +417,11 @@ output_result (const char *test_name, int result, { if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); if (verbose > 1 && print_values) { printf ("Result:\n"); @@ -377,13 +446,11 @@ output_result_ext (const char *test_name, int result, { if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); if (verbose > 1 && print_values) { printf ("Result:\n"); @@ -399,13 +466,16 @@ output_result_ext (const char *test_name, int result, fpstack_test (test_name); } - +/* + check that computed and expected values are the same + */ static void check (const char *test_name, MATHTYPE computed, MATHTYPE expected) { MATHTYPE diff; int result; + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); result = check_equal (computed, expected, 0, &diff); output_result (test_name, result, @@ -413,6 +483,10 @@ check (const char *test_name, MATHTYPE computed, MATHTYPE expected) } +/* + check that computed and expected values are the same, + outputs the parameter to the function + */ static void check_ext (const char *test_name, MATHTYPE computed, MATHTYPE expected, MATHTYPE parameter) @@ -420,6 +494,7 @@ check_ext (const char *test_name, MATHTYPE computed, MATHTYPE expected, MATHTYPE diff; int result; + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); result = check_equal (computed, expected, 0, &diff); output_result_ext (test_name, result, @@ -427,6 +502,10 @@ check_ext (const char *test_name, MATHTYPE computed, MATHTYPE expected, } +/* + check that computed and expected values are the same and + checks also for exception flags + */ static void check_exc (const char *test_name, MATHTYPE computed, MATHTYPE expected, short exception) @@ -434,13 +513,16 @@ check_exc (const char *test_name, MATHTYPE computed, MATHTYPE expected, MATHTYPE diff; int result; + output_new_test (test_name); test_exceptions (test_name, exception); result = check_equal (computed, expected, 0, &diff); output_result (test_name, result, computed, expected, diff, PRINT, PRINT); } - +/* + check that computed and expected values are close enough + */ static void check_eps (const char *test_name, MATHTYPE computed, MATHTYPE expected, MATHTYPE epsilon) @@ -448,38 +530,43 @@ check_eps (const char *test_name, MATHTYPE computed, MATHTYPE expected, MATHTYPE diff; int result; + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); result = check_equal (computed, expected, epsilon, &diff); output_result (test_name, result, computed, expected, diff, PRINT, PRINT); } - +/* + check a boolean condition + */ static void check_bool (const char *test_name, int computed) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_result_bool (test_name, computed); } - +/* + check that computed and expected values are equal (long int values) + */ static void check_long (const char *test_name, long int computed, long int expected) { long int diff = computed - expected; int result = diff == 0; + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); if (verbose > 1) { printf ("Result:\n"); @@ -492,7 +579,9 @@ check_long (const char *test_name, long int computed, long int expected) fpstack_test (test_name); } - +/* + check that computed and expected values are equal (long long int values) + */ static void check_longlong (const char *test_name, long long int computed, long long int expected) @@ -500,17 +589,16 @@ check_longlong (const char *test_name, long long int computed, long long int diff = computed - expected; int result = diff == 0; + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); if (result) { - if (verbose > 2) - printf ("Pass: %s\n", test_name); + output_pass_value (); } else { - if (verbose) - printf ("Fail: %s\n", test_name); + output_fail_value (test_name); if (verbose > 1) { printf ("Result:\n"); @@ -523,46 +611,64 @@ check_longlong (const char *test_name, long long int computed, fpstack_test (test_name); } - +/* + check that computed value is not-a-number + */ static void check_isnan (const char *test_name, MATHTYPE computed) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_isvalue (test_name, isnan (computed), computed); } +/* + check that computed value is not-a-number and test for exceptions + */ static void check_isnan_exc (const char *test_name, MATHTYPE computed, short exception) { + output_new_test (test_name); test_exceptions (test_name, exception); output_isvalue (test_name, isnan (computed), computed); } +/* + check that computed value is not-a-number and test for exceptions + */ static void check_isnan_maybe_exc (const char *test_name, MATHTYPE computed, short exception) { + output_new_test (test_name); test_not_exception (test_name, exception); output_isvalue (test_name, isnan (computed), computed); } +/* + check that computed value is not-a-number and supply parameter + */ +#ifndef TEST_INLINE static void check_isnan_ext (const char *test_name, MATHTYPE computed, MATHTYPE parameter) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_isvalue_ext (test_name, isnan (computed), computed, parameter); } +#endif /* Tests if computed is +Inf */ static void check_isinfp (const char *test_name, MATHTYPE computed) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_isvalue (test_name, (ISINF (computed) == +1), computed); } @@ -572,6 +678,7 @@ static void check_isinfp_ext (const char *test_name, MATHTYPE computed, MATHTYPE parameter) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_isvalue_ext (test_name, (ISINF (computed) == +1), computed, parameter); } @@ -582,6 +689,7 @@ static void check_isinfp_exc (const char *test_name, MATHTYPE computed, int exception) { + output_new_test (test_name); test_exceptions (test_name, exception); output_isvalue (test_name, (ISINF (computed) == +1), computed); } @@ -590,18 +698,22 @@ check_isinfp_exc (const char *test_name, MATHTYPE computed, static void check_isinfn (const char *test_name, MATHTYPE computed) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_isvalue (test_name, (ISINF (computed) == -1), computed); } +#ifndef TEST_INLINE static void check_isinfn_ext (const char *test_name, MATHTYPE computed, < |
