xref: /netbsd-src/tests/lib/libm/t_tanh.c (revision 29ebc6818ee8e63212fdcad6d1dd985b3adf5267)
1*29ebc681Smartin /* $NetBSD: t_tanh.c,v 1.7 2014/03/03 10:39:08 martin Exp $ */
2e254abd5Sjruoho 
3e254abd5Sjruoho /*-
4e254abd5Sjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5e254abd5Sjruoho  * All rights reserved.
6e254abd5Sjruoho  *
7e254abd5Sjruoho  * This code is derived from software contributed to The NetBSD Foundation
8e254abd5Sjruoho  * by Jukka Ruohonen.
9e254abd5Sjruoho  *
10e254abd5Sjruoho  * Redistribution and use in source and binary forms, with or without
11e254abd5Sjruoho  * modification, are permitted provided that the following conditions
12e254abd5Sjruoho  * are met:
13e254abd5Sjruoho  * 1. Redistributions of source code must retain the above copyright
14e254abd5Sjruoho  *    notice, this list of conditions and the following disclaimer.
15e254abd5Sjruoho  * 2. Redistributions in binary form must reproduce the above copyright
16e254abd5Sjruoho  *    notice, this list of conditions and the following disclaimer in the
17e254abd5Sjruoho  *    documentation and/or other materials provided with the distribution.
18e254abd5Sjruoho  *
19e254abd5Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20e254abd5Sjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21e254abd5Sjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22e254abd5Sjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23e254abd5Sjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24e254abd5Sjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25e254abd5Sjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26e254abd5Sjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27e254abd5Sjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28e254abd5Sjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29e254abd5Sjruoho  * POSSIBILITY OF SUCH DAMAGE.
30e254abd5Sjruoho  */
31e254abd5Sjruoho #include <sys/cdefs.h>
32*29ebc681Smartin __RCSID("$NetBSD: t_tanh.c,v 1.7 2014/03/03 10:39:08 martin Exp $");
33e254abd5Sjruoho 
34e254abd5Sjruoho #include <atf-c.h>
359a0782c3Sjruoho #include <math.h>
36e254abd5Sjruoho 
379a0782c3Sjruoho /*
389a0782c3Sjruoho  * tanh(3)
399a0782c3Sjruoho  */
409a0782c3Sjruoho ATF_TC(tanh_nan);
ATF_TC_HEAD(tanh_nan,tc)419a0782c3Sjruoho ATF_TC_HEAD(tanh_nan, tc)
42e254abd5Sjruoho {
43f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanh(NaN) == NaN");
44e254abd5Sjruoho }
45e254abd5Sjruoho 
ATF_TC_BODY(tanh_nan,tc)469a0782c3Sjruoho ATF_TC_BODY(tanh_nan, tc)
47e254abd5Sjruoho {
489a0782c3Sjruoho 	const double x = 0.0L / 0.0L;
49e254abd5Sjruoho 
509a0782c3Sjruoho 	ATF_CHECK(isnan(x) != 0);
519a0782c3Sjruoho 	ATF_CHECK(isnan(tanh(x)) != 0);
529a0782c3Sjruoho }
53b63018ecSjruoho 
549a0782c3Sjruoho ATF_TC(tanh_inf_neg);
ATF_TC_HEAD(tanh_inf_neg,tc)559a0782c3Sjruoho ATF_TC_HEAD(tanh_inf_neg, tc)
569a0782c3Sjruoho {
57f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanh(-Inf) == -1.0");
589a0782c3Sjruoho }
599a0782c3Sjruoho 
ATF_TC_BODY(tanh_inf_neg,tc)609a0782c3Sjruoho ATF_TC_BODY(tanh_inf_neg, tc)
619a0782c3Sjruoho {
629a0782c3Sjruoho 	const double x = -1.0L / 0.0L;
639a0782c3Sjruoho 
649a0782c3Sjruoho 	ATF_CHECK(tanh(x) == -1.0);
659a0782c3Sjruoho }
669a0782c3Sjruoho 
679a0782c3Sjruoho ATF_TC(tanh_inf_pos);
ATF_TC_HEAD(tanh_inf_pos,tc)689a0782c3Sjruoho ATF_TC_HEAD(tanh_inf_pos, tc)
699a0782c3Sjruoho {
70f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanh(+Inf) == +1.0");
719a0782c3Sjruoho }
729a0782c3Sjruoho 
ATF_TC_BODY(tanh_inf_pos,tc)739a0782c3Sjruoho ATF_TC_BODY(tanh_inf_pos, tc)
749a0782c3Sjruoho {
759a0782c3Sjruoho 	const double x = 1.0L / 0.0L;
769a0782c3Sjruoho 
779a0782c3Sjruoho 	ATF_CHECK(tanh(x) == 1.0);
789a0782c3Sjruoho }
799a0782c3Sjruoho 
809a0782c3Sjruoho ATF_TC(tanh_zero_neg);
ATF_TC_HEAD(tanh_zero_neg,tc)819a0782c3Sjruoho ATF_TC_HEAD(tanh_zero_neg, tc)
829a0782c3Sjruoho {
83f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanh(-0.0) == -0.0");
849a0782c3Sjruoho }
859a0782c3Sjruoho 
ATF_TC_BODY(tanh_zero_neg,tc)869a0782c3Sjruoho ATF_TC_BODY(tanh_zero_neg, tc)
879a0782c3Sjruoho {
889a0782c3Sjruoho 	const double x = -0.0L;
899a0782c3Sjruoho 	double y = tanh(x);
909a0782c3Sjruoho 
919a0782c3Sjruoho 	ATF_CHECK(x == y);
929a0782c3Sjruoho 	ATF_CHECK(signbit(x) != 0);
939a0782c3Sjruoho 
949a0782c3Sjruoho 	ATF_REQUIRE_MSG(signbit(y) != 0,
959a0782c3Sjruoho 	    "compiler bug, waiting for newer gcc import, see PR lib/44057");
969a0782c3Sjruoho }
979a0782c3Sjruoho 
989a0782c3Sjruoho ATF_TC(tanh_zero_pos);
ATF_TC_HEAD(tanh_zero_pos,tc)999a0782c3Sjruoho ATF_TC_HEAD(tanh_zero_pos, tc)
1009a0782c3Sjruoho {
101f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanh(+0.0) == +0.0");
1029a0782c3Sjruoho }
1039a0782c3Sjruoho 
ATF_TC_BODY(tanh_zero_pos,tc)1049a0782c3Sjruoho ATF_TC_BODY(tanh_zero_pos, tc)
1059a0782c3Sjruoho {
1069a0782c3Sjruoho 	const double x = 0.0L;
1079a0782c3Sjruoho 	double y = tanh(x);
1089a0782c3Sjruoho 
1099a0782c3Sjruoho 	ATF_CHECK(x == y);
1109a0782c3Sjruoho 	ATF_CHECK(signbit(x) == 0);
1119a0782c3Sjruoho 	ATF_CHECK(signbit(y) == 0);
1129a0782c3Sjruoho }
1139a0782c3Sjruoho 
114e254abd5Sjruoho /*
1159a0782c3Sjruoho  * tanhf(3)
116e254abd5Sjruoho  */
1179a0782c3Sjruoho ATF_TC(tanhf_nan);
ATF_TC_HEAD(tanhf_nan,tc)1189a0782c3Sjruoho ATF_TC_HEAD(tanhf_nan, tc)
1199a0782c3Sjruoho {
120f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanhf(NaN) == NaN");
1219a0782c3Sjruoho }
122e254abd5Sjruoho 
ATF_TC_BODY(tanhf_nan,tc)1239a0782c3Sjruoho ATF_TC_BODY(tanhf_nan, tc)
1249a0782c3Sjruoho {
1259a0782c3Sjruoho 	const float x = 0.0L / 0.0L;
1269a0782c3Sjruoho 
1279a0782c3Sjruoho 	ATF_CHECK(isnan(x) != 0);
1289a0782c3Sjruoho 	ATF_CHECK(isnan(tanhf(x)) != 0);
1299a0782c3Sjruoho }
1309a0782c3Sjruoho 
1319a0782c3Sjruoho ATF_TC(tanhf_inf_neg);
ATF_TC_HEAD(tanhf_inf_neg,tc)1329a0782c3Sjruoho ATF_TC_HEAD(tanhf_inf_neg, tc)
1339a0782c3Sjruoho {
134f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanhf(-Inf) == -1.0");
1359a0782c3Sjruoho }
1369a0782c3Sjruoho 
ATF_TC_BODY(tanhf_inf_neg,tc)1379a0782c3Sjruoho ATF_TC_BODY(tanhf_inf_neg, tc)
1389a0782c3Sjruoho {
1399a0782c3Sjruoho 	const float x = -1.0L / 0.0L;
1409a0782c3Sjruoho 
1419a0782c3Sjruoho 	ATF_CHECK(tanhf(x) == -1.0);
1429a0782c3Sjruoho }
1439a0782c3Sjruoho 
1449a0782c3Sjruoho ATF_TC(tanhf_inf_pos);
ATF_TC_HEAD(tanhf_inf_pos,tc)1459a0782c3Sjruoho ATF_TC_HEAD(tanhf_inf_pos, tc)
1469a0782c3Sjruoho {
147f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanhf(+Inf) == +1.0");
1489a0782c3Sjruoho }
1499a0782c3Sjruoho 
ATF_TC_BODY(tanhf_inf_pos,tc)1509a0782c3Sjruoho ATF_TC_BODY(tanhf_inf_pos, tc)
1519a0782c3Sjruoho {
1529a0782c3Sjruoho 	const float x = 1.0L / 0.0L;
1539a0782c3Sjruoho 
1549a0782c3Sjruoho 	ATF_CHECK(tanhf(x) == 1.0);
1559a0782c3Sjruoho }
1569a0782c3Sjruoho 
1579a0782c3Sjruoho ATF_TC(tanhf_zero_neg);
ATF_TC_HEAD(tanhf_zero_neg,tc)1589a0782c3Sjruoho ATF_TC_HEAD(tanhf_zero_neg, tc)
1599a0782c3Sjruoho {
160f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanhf(-0.0) == -0.0");
1619a0782c3Sjruoho }
1629a0782c3Sjruoho 
ATF_TC_BODY(tanhf_zero_neg,tc)1639a0782c3Sjruoho ATF_TC_BODY(tanhf_zero_neg, tc)
1649a0782c3Sjruoho {
1659a0782c3Sjruoho 	const float x = -0.0L;
1669a0782c3Sjruoho 	float y = tanh(x);
1679a0782c3Sjruoho 
1689a0782c3Sjruoho 	ATF_CHECK(x == y);
1699a0782c3Sjruoho 	ATF_CHECK(signbit(x) != 0);
1709a0782c3Sjruoho 
1719a0782c3Sjruoho 	ATF_REQUIRE_MSG(signbit(y) != 0,
17257d2159dSmartin 	    "compiler bug, waiting for newer gcc import, see PR lib/44057");
1739a0782c3Sjruoho }
1749a0782c3Sjruoho 
1759a0782c3Sjruoho ATF_TC(tanhf_zero_pos);
ATF_TC_HEAD(tanhf_zero_pos,tc)1769a0782c3Sjruoho ATF_TC_HEAD(tanhf_zero_pos, tc)
1779a0782c3Sjruoho {
178f006ee10Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test tanhf(+0.0) == +0.0");
1799a0782c3Sjruoho }
1809a0782c3Sjruoho 
ATF_TC_BODY(tanhf_zero_pos,tc)1819a0782c3Sjruoho ATF_TC_BODY(tanhf_zero_pos, tc)
1829a0782c3Sjruoho {
1839a0782c3Sjruoho 	const float x = 0.0L;
1849a0782c3Sjruoho 	float y = tanhf(x);
1859a0782c3Sjruoho 
1869a0782c3Sjruoho 	ATF_CHECK(x == y);
1879a0782c3Sjruoho 	ATF_CHECK(signbit(x) == 0);
1889a0782c3Sjruoho 	ATF_CHECK(signbit(y) == 0);
189e254abd5Sjruoho }
190e254abd5Sjruoho 
ATF_TP_ADD_TCS(tp)191e254abd5Sjruoho ATF_TP_ADD_TCS(tp)
192e254abd5Sjruoho {
1939a0782c3Sjruoho 
1949a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanh_nan);
1959a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanh_inf_neg);
1969a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanh_inf_pos);
1979a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanh_zero_neg);
1989a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanh_zero_pos);
1999a0782c3Sjruoho 
2009a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanhf_nan);
2019a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanhf_inf_neg);
2029a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanhf_inf_pos);
2039a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanhf_zero_neg);
2049a0782c3Sjruoho 	ATF_TP_ADD_TC(tp, tanhf_zero_pos);
205e254abd5Sjruoho 
206e254abd5Sjruoho 	return atf_no_error();
207e254abd5Sjruoho }
208