1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-23 15:01:03 +03:00
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.
This commit is contained in:
Ulrich Drepper
1997-05-29 12:06:58 +00:00
parent 06bdbaa0a6
commit 76b87c039b
72 changed files with 4290 additions and 704 deletions

View File

@ -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 ();