diff options
| author | Ulrich Drepper <drepper@redhat.com> | 1997-03-16 20:28:07 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 1997-03-16 20:28:07 +0000 |
| commit | 0d8733c4fc3695c7987548d10c344445f3eb552d (patch) | |
| tree | 4a2fe41c465963794a6f9d4d1717494972336e14 /math | |
| parent | 1ed4222e5724ce863a95c15eb530dfab7ef0451c (diff) | |
| download | glibc-cvs/libc-970319.tar.xz glibc-cvs/libc-970319.zip | |
Update.cvs/libc-ud-970316cvs/libc-970324cvs/libc-970323cvs/libc-970322cvs/libc-970321cvs/libc-970320cvs/libc-970319cvs/libc-970318cvs/libc-970317cvs/before-thomas-posix1996cvs/thomas-posix1996
1997-03-16 18:43 Ulrich Drepper <drepper@cygnus.com>
* manual/filesys.texi: Add documentation for scandir and alphasort.
* math/math.c (fpclassify): Correct stupid typos.
* math/libm-test.c: New file. libm test suite by Andreas Jaeger.
* nss/nss_files/files-hosts.c: Add gethostbyname2 imlementation.
* posix/Makefile (routines): Add bsd-getpgrp.
* posix/bsd-getpgrp.c: New file.
* posix/unistd.h [__FAVOR_BSD]: Define macro getpgrp which maps
calls to __bsd_getpgrp.
* sysdeps/generic/getpgrp.c: De-ANSI-declfy.
* sysdeps/i386/huge_val.h: New file. ix87 specific infinity values.
* sysdeps/m68k/huge_val.h: New file. m68k specific infinity values.
* sysdeps/generic/huge_val.h: Remove definition of long double
definition. Make it the same as the double definition.
* sysdeps/libm-i387/e_acos.S: Fix bug in FPU stack handling.
* sysdeps/libm-i387/e_acosf.S: Likewise.
* sysdeps/libm-i387/e_acosl.S: Likewise.
* sysdeps/libm-i387/e_asin.S: Likewise.
* sysdeps/libm-i387/e_asinf.S: Likewise.
* sysdeps/libm-i387/e_asinl.S: Likewise.
* sysdeps/libm-i387/e_exp.S: Likewise.
* sysdeps/libm-i387/e_expf.S: Likewise.
* sysdeps/libm-i387/e_expl.S: Likewise.
* sysdeps/libm-i387/e_scalbn.S: Likewise.
* sysdeps/libm-i387/e_scalbnf.S: Likewise.
* sysdeps/libm-i387/e_scalbnl.S: Likewise.
* sysdeps/libm-i387/e_log.S: Optimize branch code.
* sysdeps/libm-i387/e_logf.S: Likewise.
* sysdeps/libm-i387/e_logl.S: Likewise.
* sysdeps/libm-i387/e_log10.S: Likewise.
* sysdeps/libm-i387/e_log10f.S: Likewise.
* sysdeps/libm-i387/e_log10l.S: Likewise.
* sysdeps/libm-i387/e_pow.S: Major rewrite to handle special cases.
* sysdeps/libm-i387/e_powf.S: Likewise.
* sysdeps/libm-i387/e_powl.S: Likewise.
* sysdeps/libm-i387/e_expm1.S: Change return value for -inf
argument to -1.0.
* sysdeps/libm-i387/e_expm1f.S: Likewise.
* sysdeps/libm-i387/e_expm1l.S: Likewise.
* sysdeps/libm-i387/e_isinfl.c: Return -1 for -inf.
* sysdeps/libm-i387/e_logbl.S: Correct return value. Discard first
stack element after fxtract.
* sysdeps/libm-ieee754/e_atan2l.c: New file. `long double'
implementation for atan2 function.
* sysdeps/libm-ieee754/k_standard.c: Return NAN for libm not in
_SVID_ mode when acos, asin, atan2, log, log10 is called with
argument out of range.
Add new error case for pow(+0,neg).
* sysdeps/libm-ieee754/s_fpclassifyf.c: Correct recognition of
NaN and +-inf.
* sysdeps/libm-ieee754/s_fpclassifyl.c: Mask out explicit leading
digit in stupid 80 bit formats.
* sysdeps/libm-ieee754/s_isinf.c: Rewrite to return -1 for -inf.
* sysdeps/libm-ieee754/s_isinff.c: Likewise.
* sysdeps/libm-ieee754/s_isinfl.c: Likewise.
* sysdeps/libm-ieee754/s_scalbnl.c (huge, tiny): Adapt values for
long double type.
* sysdeps/libm-ieee754/w_atan2.c: Do not raise exception expect when
in SVID mode.
* sysdeps/libm-ieee754/w_atan2f.c: Likewise.
* sysdeps/libm-ieee754/w_atan2l.c: Likewise.
* sysdeps/libm-ieee754/w_pow.c: Distinguish error cases for x is +0
or -0.
* sysdeps/posix/isfdtype.c: Add cast to prevent warning.
* sysdeps/stub/fcntlbits.h: Update copyright.
* sysdeps/unix/bsd/fcntlbits.h: Likewise.
* sysdeps/unix/bsd/bsd4.4/fcntlbits.h: Likewise.
* sysdeps/unix/bsd/sun/sunos4/fcntlbits.h: Likewise.
* sysdeps/unix/bsd/ultrix4/fcntlbits.h: Likewise.
* sysdeps/unix/common/fcntlbits.h: Likewise.
* sysdeps/unix/sysv/fcntlbits.h: Likewise. Define O_FSYNC as alias
of O_SYNC. Add BSD compatibility macros FAPPEND, FFSYNC, FNONBLOCK,
and FNDELAY.
* sysdeps/unix/sysv/irix4/fcntlbits.h: Likewise.
* sysdeps/unix/readdir_r.c: Don't copy whole `struct dirent' record,
only reclen bytes.
* sysdeps/unix/sysv/linux/fcntlbits.h [__USE_GNU]: Add O_READ, O_WRITE
and O_NORW.
* sysdeps/unix/sysv/linux/alpha/fcntlbits.h: Likewise.
* sysdeps/unix/sysv/linux/init-first.h: Add copyright.
* sysdeps/unix/sysv/linux/fxstat.c: New file. Rewrite kernel-level
struct stat to user-level form.
* sysdeps/unix/sysv/linux/lxstat: New file.
* sysdeps/unix/sysv/linux/xstat: New file.
* sysdeps/unix/sysv/linux/kernel_stat.h: Define struct stat used in
kernel.
* sysdeps/unix/sysv/linux/statbuf.h (struct stat): Change definition
to use prescribed types for elements.
(_STAT_VER): Change to value 3.
* sysdeps/unix/sysv/linux/alph/statbuf.h: Likewise.
* sysdeps/unix/sysv/linux/Dist: Add kernel_stat.h.
* sysdeps/unix/sysv/linux/alpha/Dist: Likewise.
* time/Makefile: Correct dependencies for test-tz.
1997-03-16 14:59 Philip Blundell <phil@london.uk.eu.org>
* resolv/netdb.h: Add prototypes for gai_strerror and getnameinfo
(needed for IPv6 basic sockets API).
1997-03-16 15:02 a sun <asun@zoology.washington.edu>
* sysdeps/unix/sysv/linux/net/if_ppp.h: Don't use incompatible
kernel header.
* sysdeps/unix/sysv/linux/net/ppp_defs.h: Likewise.
1997-03-14 17:15 Ulrich Drepper <drepper@cygnus.com>
* db/hash/hash_bigkey.c (__big_delete): Don't call __free_ovflpage
without testing for last_bfp to be NULL.
Reported by fabsoft@fabserver1.zarm.uni-bremen.de.
1997-03-13 11:42 Jim Meyering <meyering@asic.sc.ti.com>
* time/mktime.c (TIME_T_MIN): Work around a bug in Cray C 5.0.3.0.
1997-03-14 04:00 Kurt Garloff <garloff@kg1.ping.de>
* sysdeps/unix/sysv/linux/fcntlbits.h (O_FSYNC): Make alias for O_SYNC.
(FASYNC): Move to __USE_BSD section. Create new macro O_ASYNC.
1997-03-14 02:50 Ulrich Drepper <drepper@cygnus.com>
* nis/nss_nis/nis-hosts.c (_nss_nis_gethostbyname2_r): New
functions. Compare result for correct address type.
(_nss_nis_gethostbyname_r): Use _nss_nis_gethostbyname2_r.
Reported by Mirko Streckenbach <mirko@marian.hil.de>.
1997-02-17 01:40 Zlatko Calusic <zcalusic@srce.hr>
* time/strptime.c (recursive): Return rp to caller.
(strptime_internal): First check for long names, then abbreviated
(month & weekday).
1997-03-10 19:44 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makeconfig: Remove useless definitions of ASFLAGS-%.
* config.make.in (ASFLAGS-.so): Remove.
* configure.in: Don't substitute ASFLAGS_SO.
* sysdeps/sparc/configure.in: Remove file.
* sysdeps/sparc/Makefile (ASFLAGS-.so): Define.
1997-03-11 17:00 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* time/strptime.c (strptime_internal) [case 'Y']: Always subtract
1900 from year, regardless of century.
1997-03-12 05:43 Ulrich Drepper <drepper@cygnus.com>
* stdlib/strtod.c (_tens_in_limb) [BITS_PER_MP_LIMB > 32]: Make
all numbers unsigned to make buggy gccs happy.
Patch by Bryan W. Headley <bheadley@interaccess.com>.
* sysdeps/unix/sysv/linux/netinet/ip.h: Add backward-compatibility
definitions. Patch by a sun <asun@zoology.washington.edu>.
Pretty print header.
* Makerules (build-shlib): Also create symlink if library is versioned.
based on a patch by H.J. Lu <hjl@gnu.ai.mit.edu>.
Remove special rule to libc.so symlink.
1997-03-11 20:16 Andreas Jaeger <aj@arthur.pfalz.de>
* manual/math.texi (Domain and Range Errors): Change descriptions
according to recent changes for ISO C 9X.
1997-03-11 22:39 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/libm-ieee754/k_standard.c (__kernel_standard): Correct
return values for acos, asin, and atan2.
Reported by Andreas Jaeger <aj@arthur.pfalz.de>.
1997-03-10 18:16 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* ypclnt.c (__yp_bind): Fix possible buffer overflow.
1997-03-10 18:06 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
* dirent/alphasort.c (alphasort): Interpret arguments as pointers
to pointers to directory entries so that alphasort really can be
used as argument for scandir.
1997-03-09 23:33 Andreas Jaeger <aj@arthur.pfalz.de>
* string/strdup.c: Declare memcpy if !(_LIBC || STDC_HEADERS)
instead of strcpy.
1997-03-10 03:34 Ulrich Drepper <drepper@cygnus.com>
* catgets/catgets.c (catopen): Always add NLSPATH to search path for
catalogs, not only if the envvar NLSPATH is not available.
Reported by Andries.Brouwer@cwi.nl.
1997-03-10 02:46 Ulrich Drepper <drepper@cygnus.com>
* Makeconfig (localtime-file): Don't define using installation
directory.
(inst_localtime-file): New variable.
* time/Makefile (installed-localtime-file): Use inst_localtime-file.
Reported by Edward Seidl <seidl@janed.com>.
1997-03-10 02:31 H.J. Lu <hjl@gnu.ai.mit.edu>
* time/Makefile: Add source files to dependencies for test data.
1997-03-09 22:53 Thorsten Kukuk <kukuk@weber.uni-paderborn.de>
* nis/nss_nis/nis-ethers.c: Don't ignore return value of yp_all.
* nis/nss_nis/nis-proto.c: Likewise.
* nis/nss_nis/nis-rpc.c: Likewise.
* nis/nss_nis/nis-service.c: Likewise.
1997-03-08 14:37 Miguel de Icaza <miguel@nuclecu.unam.mx>
* sysdeps/sparc/dl-machine.h (elf_machine_rela): Upgrade to
versioning; Added missing R_SPARC_WDISP30 handling.
(RTLD_START): Implement it.
* sysdeps/unix/sysv/linux/sparc/brk.c: Fix.
* sysdeps/unix/sysv/linux/sparc/start.c: Startup code for
Linux/SPARC.
1997-03-02 18:06 Miguel de Icaza <miguel@nuclecu.unam.mx>
* sysdeps/sparc/dl-machine.h (RTLD_START): Make arg as expected by
the dynamic linker instead of having a new conditional define.
Thanks to Richard Henderson for pointing this out.
* elf/rtld.c: Remove usage of ELF_ADJUST_ARG.
1997-03-20 20:44 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* sysdeps/mach/hurd/euidaccess.c: Define as __euidaccess and make
euidaccess weak alias.
1997-03-07 10:30 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* stdio-common/printf_fphex.c (MIN): New macro.
* sysdeps/generic/netinet/in.h: Include <sys/types.h>.
* sysdeps/generic/sys/mman.h (msync): Mention third arg.
* sysdeps/generic/netinet/in.h: Add definitions for IPv6 basic
API. (See change by Philip Blundell on Feb 16, 1997.)
1997-03-05 10:40 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* hurd/hurd.h (vpprintf): Include <stdarg.h>. New declaration.
* hurd/set-host.c (_hurd_set_host_config): Cast second arg to
__file_name_split.
* mach/mach_error.c (mach_error_string_int): Give full prototype.
* mach/errstring.c (mach_error_string_int): Likewise.
* mach/error_compat.c (__mach_error_map_compat): Likewise.
* hurd/vpprintf.c (pwrite, vpprintf): Likewise.
* stdio/vasprintf.c (vasprintf): Likewise.
* mach/mach/mach_traps.h: Include <mach/kern_return.h>.
* mach/spin-solid.c: Include <mach/mach_traps.h>.
* mach/spin-solid.c (__spin_lock_solid): Provide arg to
swtch_pri.
* mach/mach_init.c: Include <mach/mig_support.h>.
* mach/mach_error.h (mach_error_string, mach_error,
mach_error_type): Always provide prototypes.
* mach/mach/error.h (mach_error_fn_t): Comment out declaration; it
appears to be entirely unused dead code.
* stdio/stdio.h (freopen): Fix spelling error.
1997-03-02 13:38 Miles Bader <miles@gnu.ai.mit.edu>
* string/argz.h (__need_error_t): New macro, before including <errno.h>
[!__const] (__const): New macro.
[!__error_t_defined] (error_t): New typedef.
* sysdeps/generic/socketbits.h: Add PF_FILE as synonym for PF_LOCAL
* sysdeps/unix/sysv/linux/socketbits.h: Likewise.
Diffstat (limited to 'math')
| -rw-r--r-- | math/libm-test.c | 1520 | ||||
| -rw-r--r-- | math/math.h | 4 |
2 files changed, 1522 insertions, 2 deletions
diff --git a/math/libm-test.c b/math/libm-test.c new file mode 100644 index 0000000000..98e3cbad5d --- /dev/null +++ b/math/libm-test.c @@ -0,0 +1,1520 @@ +/* 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. + + 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 + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* + Part of testsuite for libm. + + This file has to be included by a master file that defines: + + Makros: + FUNC(function): converts general function name (like cos) to + name with correct suffix (e.g. cosl or cosf) + MATHCONST(x): like FUNC but for constants (e.g convert 0.0 to 0.0L) + MATHTYPE: floating point type to test + TEST_MSG: informal message to be displayed + CHOOSE(Clongdouble,Cdouble,Cfloat): + chooses one of the parameters as epsilon for testing + equality + PRINTF_EXPR Floating point conversion specification to print a variable + of type MATHTYPE with printf. PRINTF_EXPR just contains + the specifier, not the percent and width arguments, + e.g. "f" + */ + +/* 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. + Tests for the other libm-functions will come later. + + 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: + 0: only error count + 1: basic report on failed tests + 2: full report on failed tests + 3: full report on failed and passed tests (default) + -v for full output (equals --verbose=3) + -s,--silent outputs only the error count (equals --verbose=0) + */ + +/* Define if the following ISO C 9X functions are implemented: exp2, + log2. */ +#undef ISO_9X_IMPLEMENTED + +#define _GNU_SOURCE + +#include <math.h> +#include <float.h> + +#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 +#define DIVIDE_BY_ZERO_EXCEPTION 0x2 + +#define PRINT 1 +#define NO_PRINT 0 + +#define TEST_EXCEPTION(test) do {} while (0); +/* As long as no exception code is available prevent warnings. */ +#define UNUSED __attribute__ ((unused)) + +static int noErrors; + +static int verbose = 3; +static MATHTYPE minus_zero, plus_zero; +static MATHTYPE plus_infty, minus_infty, nan_value; + +typedef MATHTYPE (*mathfunc) (MATHTYPE); + + +#define ISINF(x) \ +(sizeof (x) == sizeof (float) ? \ + isinff (x) \ + : sizeof (x) == sizeof (double) ? \ + isinf (x) : isinfl (x)) + + + /* + Test if Floating-Point stack hasn't changed + */ +static void +fpstack_test (const char *test_name) +{ +#ifdef i386 + static int old_stack; + int sw; +asm ("fnstsw":"=a" (sw)); + sw >>= 11; + sw &= 7; + if (sw != old_stack) + { + printf ("FP-Stack wrong after test %s\n", test_name); + if (verbose > 2) + printf ("=======> stack = %d\n", sw); + ++noErrors; + old_stack = sw; + } +#endif +} + + +/* + Call to an external function so that floating point registers + get moved to memory + */ +static void +this_does_nothing (void) +{ + clock_t dummy; + + dummy = clock (); +} + +/* + Get a random value x with min_value < x < max_value + and min_value, max_value finite, + max_value and min_value shouldn't be too close together + */ +static MATHTYPE +random_value (MATHTYPE min_value, MATHTYPE max_value) +{ + int r; + MATHTYPE x; + + r = rand (); + + x = (max_value - min_value) / RAND_MAX * (MATHTYPE) r + min_value; + + if ((x <= min_value) || (x >= max_value) || !isfinite (x)) + x = (max_value - min_value) / 2 + min_value; + + return x; +} + +/* Get a random value x with x > min_value. */ +static MATHTYPE +random_greater (MATHTYPE min_value) +{ + return random_value (min_value, 1e6); /* CHOOSE (LDBL_MAX, DBL_MAX, FLT_MAX) */ +} + +/* Get a random value x with x < max_value. */ +static MATHTYPE +random_less (MATHTYPE max_value) +{ + return random_value (-1e6, max_value); +} + + +/* Test if two floating point numbers are equal. */ +static int +check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff) +{ + /* Both plus Infinity or both minus infinity. */ + if (ISINF (computed) && (ISINF (computed) == ISINF (supplied))) + return 1; + + if (isnan (computed) && isnan (supplied)) /* isnan works for all types */ + return 1; + + *diff = FUNC(fabs) (computed - supplied); + + if (*diff <= eps || signbit (computed) != signbit (supplied)) + return 1; + + return 0; +} + + +static void +output_result_bool (const char *test_name, int result) +{ + if (result) + { + if (verbose > 2) + printf ("Pass: %s\n", test_name); + } + else + { + if (verbose) + printf ("Fail: %s\n", test_name); + noErrors++; + } + + fpstack_test (test_name); +} + + +static void +output_isvalue (const char *test_name, int result, + MATHTYPE value) +{ + if (result) + { + if (verbose > 2) + printf ("Pass: %s\n", test_name); + } + else + { + if (verbose) + printf ("Fail: %s\n", test_name); + if (verbose > 1) + printf (" Value: %.20" PRINTF_EXPR "\n", value); + noErrors++; + } + + fpstack_test (test_name); +} + + +static void +output_isvalue_ext (const char *test_name, int result, + MATHTYPE value, MATHTYPE parameter) +{ + if (result) + { + if (verbose > 2) + printf ("Pass: %s\n", test_name); + } + else + { + if (verbose) + printf ("Fail: %s\n", test_name); + if (verbose > 1) + { + printf (" Value: %.20" PRINTF_EXPR "\n", value); + printf (" Parameter: %.20" PRINTF_EXPR "\n", parameter); + } + noErrors++; + } + + fpstack_test (test_name); +} + + +static void +output_result (const char *test_name, int result, + MATHTYPE computed, MATHTYPE expected, + MATHTYPE difference, + int print_values, int print_diff) +{ + if (result) + { + if (verbose > 2) + printf ("Pass: %s\n", test_name); + } + else + { + if (verbose) + printf ("Fail: %s\n", test_name); + if (verbose > 1 && print_values) + { + printf ("Result:\n"); + printf (" is: %.20" PRINTF_EXPR "\n", computed); + printf (" should be: %.20" PRINTF_EXPR "\n", expected); + if (print_diff) + printf (" difference: %.20" PRINTF_EXPR "\n", difference); + } + noErrors++; + } + + fpstack_test (test_name); +} + + +static void +output_result_ext (const char *test_name, int result, + MATHTYPE computed, MATHTYPE expected, + MATHTYPE difference, + MATHTYPE parameter, + int print_values, int print_diff) +{ + if (result) + { + if (verbose > 2) + printf ("Pass: %s\n", test_name); + } + else + { + if (verbose) + printf ("Fail: %s\n", test_name); + if (verbose > 1 && print_values) + { + printf ("Result:\n"); + printf (" is: %.20" PRINTF_EXPR "\n", computed); + printf (" should be: %.20" PRINTF_EXPR "\n", expected); + if (print_diff) + printf (" difference: %.20" PRINTF_EXPR "\n", difference); + printf ("Parameter: %.20" PRINTF_EXPR "\n", parameter); + } + noErrors++; + } + + fpstack_test (test_name); +} + + +static void +check (const char *test_name, MATHTYPE computed, MATHTYPE expected) +{ + MATHTYPE diff; + int result; + + result = check_equal (computed, expected, 0, &diff); + output_result (test_name, result, + computed, expected, diff, PRINT, PRINT); +} + + +static void +check_ext (const char *test_name, MATHTYPE computed, MATHTYPE expected, + MATHTYPE parameter) +{ + MATHTYPE diff; + int result; + + result = check_equal (computed, expected, 0, &diff); + output_result_ext (test_name, result, + computed, expected, diff, parameter, PRINT, PRINT); +} + + +static void +check_eps (const char *test_name, MATHTYPE computed, MATHTYPE expected, + MATHTYPE epsilon) +{ + MATHTYPE diff; + int result; + + result = check_equal (computed, expected, epsilon, &diff); + output_result (test_name, result, + computed, expected, diff, PRINT, PRINT); +} + + +static void +check_bool (const char *test_name, int computed) +{ + output_result_bool (test_name, computed); +} + + +static void +check_isnan (const char *test_name, MATHTYPE computed) +{ + output_isvalue (test_name, isnan (computed), computed); +} + + +static void +check_isnan_exc (const char *test_name, MATHTYPE computed, + short exception UNUSED) +{ + output_isvalue (test_name, isnan (computed), computed); +} + + +static void +check_isnan_ext (const char *test_name, MATHTYPE computed, + MATHTYPE parameter) +{ + output_isvalue_ext (test_name, isnan (computed), computed, parameter); +} + + +/* Tests if computed is +Inf */ +static void +check_isinfp (const char *test_name, MATHTYPE computed) +{ + output_isvalue (test_name, (ISINF (computed) == +1), computed); +} + + +static void +check_isinfp_ext (const char *test_name, MATHTYPE computed, + MATHTYPE parameter) +{ + output_isvalue_ext (test_name, (ISINF (computed) == +1), computed, parameter); +} + + +/* Tests if computed is +Inf */ +static void +check_isinfp_exc (const char *test_name, MATHTYPE computed, + int exception UNUSED) +{ + output_isvalue (test_name, (ISINF (computed) == +1), computed); +} + +/* Tests if computed is -Inf */ +static void +check_isinfn (const char *test_name, MATHTYPE computed) +{ + output_isvalue (test_name, (ISINF (computed) == -1), computed); +} + + +static void +check_isinfn_ext (const char *test_name, MATHTYPE computed, + MATHTYPE parameter) +{ + output_isvalue_ext (test_name, (ISINF (computed) == -1), computed, parameter); +} + + +/* Tests if computed is -Inf */ +static void +check_isinfn_exc (const char *test_name, MATHTYPE computed, + int exception UNUSED) +{ + output_isvalue (test_name, (ISINF (computed) == -1), computed); +} + + +/**************************************************************************** + Test for single functions of libm +****************************************************************************/ + +static void +acos_test (void) +{ + MATHTYPE x; + + check ("acos (1) == 0", FUNC(acos) (1), 0); + + x = random_greater (1); + check_isnan_exc ("acos (x) == NaN + invalid exception for |x| > 1", + FUNC(acos) (x), + INVALID_EXCEPTION); +} + +static void +acosh_test (void) +{ + 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); +} + + +static void +asin_test (void) +{ + MATHTYPE x; + check ("asin (0) == 0", FUNC(asin) (0), 0); + + x = random_greater (1); + check_isnan_exc ("asin x == NaN + invalid exception for |x| > 1", + FUNC(asin) (x), + INVALID_EXCEPTION); +} + +static void +asinh_test (void) +{ + + check ("asinh(+0) == +0", FUNC(asinh) (0), 0); + check ("asinh(-0) == -0", FUNC(asinh) (minus_zero), minus_zero); +} + + +static void +atan_test (void) +{ + check ("atan (0) == 0", FUNC(atan) (0), 0); + check ("atan (-0) == -0", FUNC(atan) (minus_zero), minus_zero); + + 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 +atan2_test (void) +{ + MATHTYPE x; + + x = random_greater (0); + check ("atan2 (0,x) == 0 for x > 0", + FUNC(atan2) (0, x), 0); + x = random_greater (0); + check ("atan2 (-0,x) == -0 for x > 0", + FUNC(atan2) (minus_zero, x), minus_zero); + + check ("atan2 (+0,+0) == +0", FUNC(atan2) (0, 0), 0); + check ("atan2 (-0,+0) == -0", FUNC(atan2) (minus_zero, 0), minus_zero); + + x = -random_greater (0); + check ("atan2 (+0,x) == +pi for x < 0", FUNC(atan2) (0, x), M_PI); + + x = -random_greater (0); + check ("atan2 (-0,x) == -pi for x < 0", FUNC(atan2) (minus_zero, x), -M_PI); + + check ("atan2 (+0,-0) == +pi", FUNC(atan2) (0, minus_zero), M_PI); + check ("atan2 (-0,-0) == -pi", FUNC(atan2) (minus_zero, minus_zero), -M_PI); + + x = random_greater (0); + check ("atan2 (y,+0) == pi/2 for y > 0", FUNC(atan2) (x, 0), M_PI_2); + + x = random_greater (0); + check ("atan2 (y,-0) == pi/2 for y > 0", FUNC(atan2) (x, minus_zero), M_PI_2); + + x = random_greater (0); + check ("atan2 (y,-inf) == +pi for finite y > 0", + FUNC(atan2) (x, minus_infty), M_PI); + + x = -random_greater (0); + check ("atan2 (y,-inf) == -pi for finite y < 0", + FUNC(atan2) (x, minus_infty), -M_PI); + + check ("atan2 (+inf,+inf) == +pi/4", + FUNC(atan2) (plus_infty, plus_infty), M_PI_4); + + check ("atan2 (-inf,+inf) == -pi/4", + FUNC(atan2) (minus_infty, plus_infty), -M_PI_4); + + check ("atan2 (+inf,-inf) == +3*pi/4", + FUNC(atan2) (plus_infty, minus_infty), 3 * M_PI_4); + + check ("atan2 (-inf,-inf) == -3*pi/4", + FUNC(atan2) (minus_infty, minus_infty), -3 * M_PI_4); +} + + +static void +atanh_test (void) +{ |
