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/libm-test.c | |
parent | 06bdbaa0a614c256b34214fde7c395f9e0a6206c (diff) | |
download | glibc-76b87c039ba8d20add4f52ba43f3471fd92e210b.zip glibc-76b87c039ba8d20add4f52ba43f3471fd92e210b.tar.gz glibc-76b87c039ba8d20add4f52ba43f3471fd92e210b.tar.bz2 |
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/libm-test.c')
-rw-r--r-- | math/libm-test.c | 307 |
1 files changed, 237 insertions, 70 deletions
diff --git a/math/libm-test.c b/math/libm-test.c index 1f64d1a..866313e 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, MATHTYPE parameter) { + output_new_test (test_name); test_exceptions (test_name, NO_EXCEPTION); output_isvalue_ext (test_name, (ISINF (computed) == -1), computed, parameter); } +#endif /* Tests if computed is -Inf */ @@ -609,6 +721,7 @@ static void check_isinfn_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); } @@ -621,48 +734,59 @@ check_isinfn_exc (const char *test_name, MATHTYPE computed, static void acos_test (void) { +#ifndef TEST_INLINE MATHTYPE x; - check ("acos (1) == 0", FUNC(acos) (1), 0); - x = random_greater (1); check_isnan_exc ("acos (x) == NaN plus invalid exception for |x| > 1", FUNC(acos) (x), INVALID_EXCEPTION); +#endif + + check ("acos (1) == 0", FUNC(acos) (1), 0); } static void acosh_test (void) { +#ifndef TEST_INLINE MATHTYPE x; - check ("acosh(1) == 0", FUNC(acosh) (1), 0); check_isinfp ("acosh(+inf) == +inf", FUNC(acosh) (plus_infty)); x = random_less (1); check_isnan_exc ("acosh(x) == NaN plus invalid exception if x < 1", FUNC(acosh) (x), INVALID_EXCEPTION); +#endif + + check ("acosh(1) == 0", FUNC(acosh) (1), 0); } static void asin_test (void) { +#ifndef TEST_INLINE MATHTYPE x; - check ("asin (0) == 0", FUNC(asin) (0), 0); x = random_greater (1); check_isnan_exc ("asin x == NaN plus invalid exception for |x| > 1", FUNC(asin) (x), INVALID_EXCEPTION); +#endif + + check ("asin (0) == 0", FUNC(asin) (0), 0); } + static void asinh_test (void) { check ("asinh(+0) == +0", FUNC(asinh) (0), 0); +#ifndef TEST_INLINE check ("asinh(-0) == -0", FUNC(asinh) (minus_zero), minus_zero); +#endif } @@ -674,7 +798,6 @@ atan_test (void) check ("atan (+inf) == pi/2", FUNC(atan) (plus_infty), M_PI_2); check ("atan (-inf) == -pi/2", FUNC(atan) (minus_infty), -M_PI_2); - } static void @@ -734,11 +857,14 @@ atanh_test (void) { check ("atanh(+0) == +0", FUNC(atanh) (0), 0); +#ifndef TEST_INLINE check ("atanh(-0) == -0", FUNC(atanh) (minus_zero), minus_zero); + check_isinfp_exc ("atanh(+1) == +inf plus divide-by-zero exception", FUNC(atanh) (1), DIVIDE_BY_ZERO_EXCEPTION); check_isinfn_exc ("atanh(-1) == -inf plus divide-by-zero exception", FUNC(atanh) (-1), DIVIDE_BY_ZERO_EXCEPTION); +#endif } @@ -748,10 +874,11 @@ cbrt_test (void) check ("cbrt (+0) == +0", FUNC(cbrt) (0.0), 0.0); check ("cbrt (-0) == -0", FUNC(cbrt) (minus_zero), minus_zero); +#ifndef TEST_INLINE check_isinfp ("cbrt (+inf) == +inf", FUNC(cbrt) (plus_infty)); check_isinfn ("cbrt (-inf) == -inf", FUNC(cbrt) (minus_infty)); check_isnan ("cbrt (NaN) == NaN", FUNC(cbrt) (nan_value)); - +#endif check_eps ("cbrt (8) == 2", FUNC(cbrt) (8), 2, CHOOSE (5e-17L, 0, 0)); check_eps ("cbrt (-27) == -3", FUNC(cbrt) (-27.0), -3.0, CHOOSE (3e-16L, 0, 0)); @@ -797,8 +924,10 @@ cosh_test (void) check ("cosh (+0) == 1", FUNC(cosh) (0), 1); check ("cosh (-0) == 1", FUNC(cosh) (minus_zero), 1); +#ifndef TEST_INLINE check_isinfp ("cosh (+inf) == +inf", FUNC(cosh) (plus_infty)); check_isinfp ("cosh (-inf) == +inf", FUNC(cosh) (minus_infty)); +#endif } @@ -808,9 +937,10 @@ exp_test (void) check ("exp (+0) == 1", FUNC(exp) (0), 1); check ("exp (-0) == 1", FUNC(exp) (minus_zero), 1); +#ifndef TEST_INLINE check_isinfp ("exp (+inf) == +inf", FUNC(exp) (plus_infty)); check ("exp (-inf) == 0", FUNC(exp) (minus_infty), 0); - +#endif check_eps ("exp (1) == e", FUNC(exp) (1), M_E, CHOOSE (4e-18L, 0, 0)); } @@ -1207,10 +1337,13 @@ static void sinh_test (void) { check ("sinh (+0) == +0", FUNC(sinh) (0), 0); + +#ifndef TEST_INLINE check ("sinh (-0) == -0", FUNC(sinh) (minus_zero), minus_zero); check_isinfp ("sinh (+inf) == +inf", FUNC(sinh) (plus_infty)); check_isinfn ("sinh (-inf) == -inf", FUNC(sinh) (minus_infty)); +#endif } @@ -1233,10 +1366,12 @@ static void tanh_test (void) { check ("tanh (+0) == +0", FUNC(tanh) (0), 0); +#ifndef TEST_INLINE check ("tanh (-0) == -0", FUNC(tanh) (minus_zero), minus_zero); check ("tanh (+inf) == +1", FUNC(tanh) (plus_infty), 1); check ("tanh (-inf) == -1", FUNC(tanh) (minus_infty), -1); +#endif } @@ -1311,6 +1446,7 @@ pow_test (void) check ("pow (NaN, +0) == 1", FUNC(pow) (nan_value, 0), 1); check ("pow (NaN, -0) == 1", FUNC(pow) (nan_value, minus_zero), 1); +#ifndef TEST_INLINE check_isinfp ("pow (+1.1, +inf) == +inf", FUNC(pow) (1.1, plus_infty)); check_isinfp ("pow (+inf, +inf) == +inf", FUNC(pow) (plus_infty, plus_infty)); check_isinfp ("pow (-1.1, +inf) == +inf", FUNC(pow) (-1.1, plus_infty)); @@ -1408,14 +1544,19 @@ pow_test (void) FUNC(pow) (minus_zero, -2), DIVIDE_BY_ZERO_EXCEPTION); check_isinfp_exc ("pow (-0, -11.1) == +inf plus divide-by-zero exception", FUNC(pow) (minus_zero, -11.1), DIVIDE_BY_ZERO_EXCEPTION); +#endif check ("pow (+0, 1) == +0", FUNC(pow) (0, 1), 0); check ("pow (+0, 11) == +0", FUNC(pow) (0, 11), 0); +#ifndef TEST_INLINE check ("pow (-0, 1) == -0", FUNC(pow) (minus_zero, 1), minus_zero); check ("pow (-0, 11) == -0", FUNC(pow) (minus_zero, 11), minus_zero); +#endif check ("pow (+0, 2) == +0", FUNC(pow) (0, 2), 0); check ("pow (+0, 11.1) == +0", FUNC(pow) (0, 11.1), 0); + +#ifndef TEST_INLINE check ("pow (-0, 2) == +0", FUNC(pow) (minus_zero, 2), 0); check ("pow (-0, 11.1) == +0", FUNC(pow) (minus_zero, 11.1), 0); @@ -1425,11 +1566,11 @@ pow_test (void) x = random_value (-1.0, 1.0); check_ext ("pow (x, +inf) == +0 for |x| < 1", - FUNC(pow) (x, plus_infty), 0.0, x); + FUNC(pow) (x, plus_infty), 0.0, x); x = random_greater (1.0); check_ext ("pow (x, -inf) == +0 for |x| > 1", - FUNC(pow) (x, minus_infty), 0.0, x); + FUNC(pow) (x, minus_infty), 0.0, x); x = random_value (-1.0, 1.0); check_isinfp_ext ("pow (x, -inf) == +inf for |x| < 1", @@ -1458,13 +1599,16 @@ pow_test (void) 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), 0.0, x); +#endif x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */ check_ext ("pow (+0, y) == +0 for y an odd integer > 0", FUNC(pow) (0.0, x), 0.0, x); +#ifndef TEST_INLINE x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */ check_ext ("pow (-0, y) == -0 for y an odd integer > 0", FUNC(pow) (minus_zero, x), minus_zero, x); +#endif x = ((rand () % 1000000) + 1) * 2.0; /* Get random even integer > 1 */ check_ext ("pow (+0, y) == +0 for y > 0 and not an odd integer", @@ -1682,6 +1826,7 @@ sqrt_test (void) x = random_value (0, 10000); check_ext ("sqrt (x*x) == x", FUNC(sqrt) (x*x), x, x); check ("sqrt (4) == 2", FUNC(sqrt) (4), 2); + } @@ -1741,11 +1886,18 @@ cexp_test (void) check ("real(cexp(-inf - 0i)) = 0", __real__ result, 0); check ("imag(cexp(-inf - 0i)) = -0", __imag__ result, minus_zero); + result = FUNC(cexp) (BUILD_COMPLEX (0.0, plus_infty)); check_isnan_exc ("real(cexp(0 + i inf)) = NaN plus invalid exception", __real__ result, INVALID_EXCEPTION); check_isnan ("imag(cexp(0 + i inf)) = NaN plus invalid exception", __imag__ result); + +#if defined __GNUC__ && __GNUC__ <= 2 && __GNUC_MINOR <= 7 + if (verbose) + printf ("The following test for cexp might fail due to a gcc compiler error!\n"); +#endif + result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, plus_infty)); check_isnan_exc ("real(cexp(-0 + i inf)) = NaN plus invalid exception", __real__ result, INVALID_EXCEPTION); @@ -3757,6 +3909,15 @@ static void cpow_test (void) { __complex__ MATHTYPE result; + + result = FUNC (cpow) (BUILD_COMPLEX (1, 0), BUILD_COMPLEX (0, 0)); + check ("real(cpow (1 + i0), (0 + i0)) = 0", __real__ result, 1); + check ("imag(cpow (1 + i0), (0 + i0)) = 0", __imag__ result, 0); + + result = FUNC (cpow) (BUILD_COMPLEX (2, 0), BUILD_COMPLEX (10, 0)); + check ("real(cpow (2 + i0), (10 + i0)) = 1024", __real__ result, 1024); + check ("imag(cpow (2 + i0), (10 + i0)) = 0", __imag__ result, 0); + } @@ -3887,6 +4048,7 @@ inverse_func_pair_test (const char *test_name, b = inverse (a); (void) &b; + output_new_test (test_name); result = check_equal (b, x, epsilon, &difference); output_result (test_name, result, b, x, difference, PRINT, PRINT); @@ -3941,6 +4103,7 @@ identities1_test (MATHTYPE x, MATHTYPE epsilon) res3 = res1 * res1 + res2 * res2; (void) &res3; + output_new_test ("sin^2 + cos^2 == 1"); result = check_equal (res3, 1.0, epsilon, &diff); output_result_ext ("sin^2 + cos^2 == 1", result, res3, 1.0, diff, x, PRINT, PRINT); @@ -3963,6 +4126,7 @@ identities2_test (MATHTYPE x, MATHTYPE epsilon) res4 = res1 / res2; (void) &res4; + output_new_test ("sin/cos == tan"); result = check_equal (res4, res3, epsilon, &diff); output_result_ext ("sin/cos == tan", result, res4, res3, diff, x, PRINT, PRINT); @@ -3983,6 +4147,7 @@ identities3_test (MATHTYPE x, MATHTYPE epsilon) res3 = res2 * res2 - res1 * res1; (void) &res3; + output_new_test ("cosh^2 - sinh^2 == 1"); result = check_equal (res3, 1.0, epsilon, &diff); output_result_ext ("cosh^2 - sinh^2 == 1", result, res3, 1.0, diff, x, PRINT, PRINT); @@ -4142,7 +4307,7 @@ parse_options (int argc, char *argv[]) if (optarg) verbose = (unsigned int) strtoul (optarg, NULL, 0); else - verbose = 3; + verbose = 4; break; case 's': verbose = 0; @@ -4156,10 +4321,12 @@ parse_options (int argc, char *argv[]) int main (int argc, char *argv[]) { + parse_options (argc, argv); initialize (); printf (TEST_MSG); + basic_tests (); acos_test (); |