t_tanh.c revision 272343
1272343Sngie/* $NetBSD: t_tanh.c,v 1.7 2014/03/03 10:39:08 martin Exp $ */ 2272343Sngie 3272343Sngie/*- 4272343Sngie * Copyright (c) 2011 The NetBSD Foundation, Inc. 5272343Sngie * All rights reserved. 6272343Sngie * 7272343Sngie * This code is derived from software contributed to The NetBSD Foundation 8272343Sngie * by Jukka Ruohonen. 9272343Sngie * 10272343Sngie * Redistribution and use in source and binary forms, with or without 11272343Sngie * modification, are permitted provided that the following conditions 12272343Sngie * are met: 13272343Sngie * 1. Redistributions of source code must retain the above copyright 14272343Sngie * notice, this list of conditions and the following disclaimer. 15272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 16272343Sngie * notice, this list of conditions and the following disclaimer in the 17272343Sngie * documentation and/or other materials provided with the distribution. 18272343Sngie * 19272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22272343Sngie * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29272343Sngie * POSSIBILITY OF SUCH DAMAGE. 30272343Sngie */ 31272343Sngie#include <sys/cdefs.h> 32272343Sngie__RCSID("$NetBSD: t_tanh.c,v 1.7 2014/03/03 10:39:08 martin Exp $"); 33272343Sngie 34272343Sngie#include <atf-c.h> 35272343Sngie#include <math.h> 36272343Sngie 37272343Sngie/* 38272343Sngie * tanh(3) 39272343Sngie */ 40272343SngieATF_TC(tanh_nan); 41272343SngieATF_TC_HEAD(tanh_nan, tc) 42272343Sngie{ 43272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanh(NaN) == NaN"); 44272343Sngie} 45272343Sngie 46272343SngieATF_TC_BODY(tanh_nan, tc) 47272343Sngie{ 48272343Sngie const double x = 0.0L / 0.0L; 49272343Sngie 50272343Sngie ATF_CHECK(isnan(x) != 0); 51272343Sngie ATF_CHECK(isnan(tanh(x)) != 0); 52272343Sngie} 53272343Sngie 54272343SngieATF_TC(tanh_inf_neg); 55272343SngieATF_TC_HEAD(tanh_inf_neg, tc) 56272343Sngie{ 57272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanh(-Inf) == -1.0"); 58272343Sngie} 59272343Sngie 60272343SngieATF_TC_BODY(tanh_inf_neg, tc) 61272343Sngie{ 62272343Sngie const double x = -1.0L / 0.0L; 63272343Sngie 64272343Sngie ATF_CHECK(tanh(x) == -1.0); 65272343Sngie} 66272343Sngie 67272343SngieATF_TC(tanh_inf_pos); 68272343SngieATF_TC_HEAD(tanh_inf_pos, tc) 69272343Sngie{ 70272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanh(+Inf) == +1.0"); 71272343Sngie} 72272343Sngie 73272343SngieATF_TC_BODY(tanh_inf_pos, tc) 74272343Sngie{ 75272343Sngie const double x = 1.0L / 0.0L; 76272343Sngie 77272343Sngie ATF_CHECK(tanh(x) == 1.0); 78272343Sngie} 79272343Sngie 80272343SngieATF_TC(tanh_zero_neg); 81272343SngieATF_TC_HEAD(tanh_zero_neg, tc) 82272343Sngie{ 83272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanh(-0.0) == -0.0"); 84272343Sngie} 85272343Sngie 86272343SngieATF_TC_BODY(tanh_zero_neg, tc) 87272343Sngie{ 88272343Sngie const double x = -0.0L; 89272343Sngie double y = tanh(x); 90272343Sngie 91272343Sngie ATF_CHECK(x == y); 92272343Sngie ATF_CHECK(signbit(x) != 0); 93272343Sngie 94272343Sngie ATF_REQUIRE_MSG(signbit(y) != 0, 95272343Sngie "compiler bug, waiting for newer gcc import, see PR lib/44057"); 96272343Sngie} 97272343Sngie 98272343SngieATF_TC(tanh_zero_pos); 99272343SngieATF_TC_HEAD(tanh_zero_pos, tc) 100272343Sngie{ 101272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanh(+0.0) == +0.0"); 102272343Sngie} 103272343Sngie 104272343SngieATF_TC_BODY(tanh_zero_pos, tc) 105272343Sngie{ 106272343Sngie const double x = 0.0L; 107272343Sngie double y = tanh(x); 108272343Sngie 109272343Sngie ATF_CHECK(x == y); 110272343Sngie ATF_CHECK(signbit(x) == 0); 111272343Sngie ATF_CHECK(signbit(y) == 0); 112272343Sngie} 113272343Sngie 114272343Sngie/* 115272343Sngie * tanhf(3) 116272343Sngie */ 117272343SngieATF_TC(tanhf_nan); 118272343SngieATF_TC_HEAD(tanhf_nan, tc) 119272343Sngie{ 120272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanhf(NaN) == NaN"); 121272343Sngie} 122272343Sngie 123272343SngieATF_TC_BODY(tanhf_nan, tc) 124272343Sngie{ 125272343Sngie const float x = 0.0L / 0.0L; 126272343Sngie 127272343Sngie ATF_CHECK(isnan(x) != 0); 128272343Sngie ATF_CHECK(isnan(tanhf(x)) != 0); 129272343Sngie} 130272343Sngie 131272343SngieATF_TC(tanhf_inf_neg); 132272343SngieATF_TC_HEAD(tanhf_inf_neg, tc) 133272343Sngie{ 134272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanhf(-Inf) == -1.0"); 135272343Sngie} 136272343Sngie 137272343SngieATF_TC_BODY(tanhf_inf_neg, tc) 138272343Sngie{ 139272343Sngie const float x = -1.0L / 0.0L; 140272343Sngie 141272343Sngie ATF_CHECK(tanhf(x) == -1.0); 142272343Sngie} 143272343Sngie 144272343SngieATF_TC(tanhf_inf_pos); 145272343SngieATF_TC_HEAD(tanhf_inf_pos, tc) 146272343Sngie{ 147272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanhf(+Inf) == +1.0"); 148272343Sngie} 149272343Sngie 150272343SngieATF_TC_BODY(tanhf_inf_pos, tc) 151272343Sngie{ 152272343Sngie const float x = 1.0L / 0.0L; 153272343Sngie 154272343Sngie ATF_CHECK(tanhf(x) == 1.0); 155272343Sngie} 156272343Sngie 157272343SngieATF_TC(tanhf_zero_neg); 158272343SngieATF_TC_HEAD(tanhf_zero_neg, tc) 159272343Sngie{ 160272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanhf(-0.0) == -0.0"); 161272343Sngie} 162272343Sngie 163272343SngieATF_TC_BODY(tanhf_zero_neg, tc) 164272343Sngie{ 165272343Sngie const float x = -0.0L; 166272343Sngie float y = tanh(x); 167272343Sngie 168272343Sngie ATF_CHECK(x == y); 169272343Sngie ATF_CHECK(signbit(x) != 0); 170272343Sngie 171272343Sngie ATF_REQUIRE_MSG(signbit(y) != 0, 172272343Sngie "compiler bug, waiting for newer gcc import, see PR lib/44057"); 173272343Sngie} 174272343Sngie 175272343SngieATF_TC(tanhf_zero_pos); 176272343SngieATF_TC_HEAD(tanhf_zero_pos, tc) 177272343Sngie{ 178272343Sngie atf_tc_set_md_var(tc, "descr", "Test tanhf(+0.0) == +0.0"); 179272343Sngie} 180272343Sngie 181272343SngieATF_TC_BODY(tanhf_zero_pos, tc) 182272343Sngie{ 183272343Sngie const float x = 0.0L; 184272343Sngie float y = tanhf(x); 185272343Sngie 186272343Sngie ATF_CHECK(x == y); 187272343Sngie ATF_CHECK(signbit(x) == 0); 188272343Sngie ATF_CHECK(signbit(y) == 0); 189272343Sngie} 190272343Sngie 191272343SngieATF_TP_ADD_TCS(tp) 192272343Sngie{ 193272343Sngie 194272343Sngie ATF_TP_ADD_TC(tp, tanh_nan); 195272343Sngie ATF_TP_ADD_TC(tp, tanh_inf_neg); 196272343Sngie ATF_TP_ADD_TC(tp, tanh_inf_pos); 197272343Sngie ATF_TP_ADD_TC(tp, tanh_zero_neg); 198272343Sngie ATF_TP_ADD_TC(tp, tanh_zero_pos); 199272343Sngie 200272343Sngie ATF_TP_ADD_TC(tp, tanhf_nan); 201272343Sngie ATF_TP_ADD_TC(tp, tanhf_inf_neg); 202272343Sngie ATF_TP_ADD_TC(tp, tanhf_inf_pos); 203272343Sngie ATF_TP_ADD_TC(tp, tanhf_zero_neg); 204272343Sngie ATF_TP_ADD_TC(tp, tanhf_zero_pos); 205272343Sngie 206272343Sngie return atf_no_error(); 207272343Sngie} 208