mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 11:20:07 +00:00
d15e83c5f5
As per C11 DR#471, ctanh (0 + i NaN) and ctanh (0 + i Inf) should return 0 + i NaN (with "invalid" exception in the second case but not the first), not NaN + i NaN. This has corresponding implications for ctan since its special cases are defined by ctan (z) = -i ctanh (iz). This patch implements these cases for ctanh and ctan, updating tests accordingly. Tested for x86_64. [BZ #22568] * math/s_ctan_template.c (M_DECL_FUNC (__ctan)): Set imaginary part of result to imaginary part of argument if it is zero and the real part of the argument is not finite. * math/s_ctanh_template.c (M_DECL_FUNC (__ctanh)): Set real part of result to real part of argument if it is zero and the imaginary part of the argument is not finite.
141 lines
6.0 KiB
SQL
141 lines
6.0 KiB
SQL
/* Test ctanh.
|
|
Copyright (C) 1997-2017 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 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
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include "libm-test-driver.c"
|
|
|
|
static const struct test_c_c_data ctanh_test_data[] =
|
|
{
|
|
TEST_c_c (ctanh, plus_infty, 0, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, 1, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, 2, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, 3, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, 4, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, min_value, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, min_subnorm_value, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, 0x1p127, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, 0x1.11p127, 1.0, minus_zero),
|
|
#if !TEST_COND_binary32
|
|
TEST_c_c (ctanh, plus_infty, 0x1p1023, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, 0x1.5p1023, 1.0, 0.0),
|
|
#endif
|
|
#if MAX_EXP >= 16384
|
|
TEST_c_c (ctanh, plus_infty, 0x1p16383L, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, 0x1.2p16383L, 1.0, minus_zero),
|
|
#endif
|
|
TEST_c_c (ctanh, plus_infty, minus_zero, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -1, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -2, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, -3, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, -4, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -min_value, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -min_subnorm_value, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -0x1p127, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -0x1.11p127, 1.0, 0.0),
|
|
#if !TEST_COND_binary32
|
|
TEST_c_c (ctanh, plus_infty, -0x1p1023, 1.0, 0.0),
|
|
TEST_c_c (ctanh, plus_infty, -0x1.5p1023, 1.0, minus_zero),
|
|
#endif
|
|
#if MAX_EXP >= 16384
|
|
TEST_c_c (ctanh, plus_infty, -0x1p16383L, 1.0, minus_zero),
|
|
TEST_c_c (ctanh, plus_infty, -0x1.2p16383L, 1.0, 0.0),
|
|
#endif
|
|
TEST_c_c (ctanh, minus_infty, 0, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, 1, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, 2, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, 3, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, 4, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, min_value, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, min_subnorm_value, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, 0x1p127, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, 0x1.11p127, -1.0, minus_zero),
|
|
#if !TEST_COND_binary32
|
|
TEST_c_c (ctanh, minus_infty, 0x1p1023, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, 0x1.5p1023, -1.0, 0.0),
|
|
#endif
|
|
#if MAX_EXP >= 16384
|
|
TEST_c_c (ctanh, minus_infty, 0x1p16383L, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, 0x1.2p16383L, -1.0, minus_zero),
|
|
#endif
|
|
TEST_c_c (ctanh, minus_infty, minus_zero, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -1, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -2, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, -3, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, -4, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -min_value, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -min_subnorm_value, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -0x1p127, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -0x1.11p127, -1.0, 0.0),
|
|
#if !TEST_COND_binary32
|
|
TEST_c_c (ctanh, minus_infty, -0x1p1023, -1.0, 0.0),
|
|
TEST_c_c (ctanh, minus_infty, -0x1.5p1023, -1.0, minus_zero),
|
|
#endif
|
|
#if MAX_EXP >= 16384
|
|
TEST_c_c (ctanh, minus_infty, -0x1p16383L, -1.0, minus_zero),
|
|
TEST_c_c (ctanh, minus_infty, -0x1.2p16383L, -1.0, 0.0),
|
|
#endif
|
|
|
|
TEST_c_c (ctanh, 0, plus_infty, 0, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, 2, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, 0, minus_infty, 0, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, 2, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, minus_zero, plus_infty, minus_zero, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, -2, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, minus_zero, minus_infty, minus_zero, qnan_value, INVALID_EXCEPTION),
|
|
TEST_c_c (ctanh, -2, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
|
|
|
|
TEST_c_c (ctanh, plus_infty, qnan_value, 1.0, 0.0, IGNORE_ZERO_INF_SIGN),
|
|
TEST_c_c (ctanh, plus_infty, plus_infty, 1.0, 0.0, IGNORE_ZERO_INF_SIGN),
|
|
TEST_c_c (ctanh, plus_infty, minus_infty, 1.0, 0.0, IGNORE_ZERO_INF_SIGN),
|
|
TEST_c_c (ctanh, minus_infty, qnan_value, -1.0, 0.0, IGNORE_ZERO_INF_SIGN),
|
|
TEST_c_c (ctanh, minus_infty, plus_infty, -1.0, 0.0, IGNORE_ZERO_INF_SIGN),
|
|
TEST_c_c (ctanh, minus_infty, minus_infty, -1.0, 0.0, IGNORE_ZERO_INF_SIGN),
|
|
|
|
TEST_c_c (ctanh, qnan_value, 0, qnan_value, 0.0),
|
|
TEST_c_c (ctanh, qnan_value, minus_zero, qnan_value, minus_zero),
|
|
|
|
TEST_c_c (ctanh, qnan_value, 0.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
|
|
TEST_c_c (ctanh, qnan_value, -4.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
|
|
|
|
TEST_c_c (ctanh, 0, qnan_value, 0, qnan_value),
|
|
TEST_c_c (ctanh, 5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
|
|
TEST_c_c (ctanh, minus_zero, qnan_value, minus_zero, qnan_value),
|
|
TEST_c_c (ctanh, -0.25, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
|
|
|
|
TEST_c_c (ctanh, qnan_value, qnan_value, qnan_value, qnan_value),
|
|
|
|
AUTO_TESTS_c_c (ctanh),
|
|
};
|
|
|
|
static void
|
|
ctanh_test (void)
|
|
{
|
|
ALL_RM_TEST (ctanh, 0, ctanh_test_data, RUN_TEST_LOOP_c_c, END_COMPLEX);
|
|
}
|
|
|
|
static void
|
|
do_test (void)
|
|
{
|
|
ctanh_test ();
|
|
}
|
|
|
|
/*
|
|
* Local Variables:
|
|
* mode:c
|
|
* End:
|
|
*/
|