xref: /netbsd-src/tests/lib/libm/t_atan.c (revision d9c366827a00abb6f354d099ae23eb78bc2c7168)
1*d9c36682Smartin /* $NetBSD: t_atan.c,v 1.15 2014/03/17 11:08:11 martin Exp $ */
2e0a0895cSjruoho 
3e0a0895cSjruoho /*-
4e0a0895cSjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5e0a0895cSjruoho  * All rights reserved.
6e0a0895cSjruoho  *
7e0a0895cSjruoho  * This code is derived from software contributed to The NetBSD Foundation
8e0a0895cSjruoho  * by Jukka Ruohonen.
9e0a0895cSjruoho  *
10e0a0895cSjruoho  * Redistribution and use in source and binary forms, with or without
11e0a0895cSjruoho  * modification, are permitted provided that the following conditions
12e0a0895cSjruoho  * are met:
13e0a0895cSjruoho  * 1. Redistributions of source code must retain the above copyright
14e0a0895cSjruoho  *    notice, this list of conditions and the following disclaimer.
15e0a0895cSjruoho  * 2. Redistributions in binary form must reproduce the above copyright
16e0a0895cSjruoho  *    notice, this list of conditions and the following disclaimer in the
17e0a0895cSjruoho  *    documentation and/or other materials provided with the distribution.
18e0a0895cSjruoho  *
19e0a0895cSjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20e0a0895cSjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21e0a0895cSjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22e0a0895cSjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23e0a0895cSjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24e0a0895cSjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25e0a0895cSjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26e0a0895cSjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27e0a0895cSjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28e0a0895cSjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29e0a0895cSjruoho  * POSSIBILITY OF SUCH DAMAGE.
30e0a0895cSjruoho  */
31e0a0895cSjruoho 
32e0a0895cSjruoho #include <atf-c.h>
33e0a0895cSjruoho #include <math.h>
34a701b24dSdsl #include "t_libm.h"
35e0a0895cSjruoho 
360c8b5b21Sisaki static const struct {
370c8b5b21Sisaki 	double x;
380c8b5b21Sisaki 	double y;
390c8b5b21Sisaki } values[] = {
401ecc2818Smartin #ifndef __vax__
411ecc2818Smartin 	/* vax has no +/- INF */
42a701b24dSdsl 	{ T_LIBM_MINUS_INF, -M_PI / 2 },
43a701b24dSdsl 	{ T_LIBM_PLUS_INF,   M_PI / 2 },
441ecc2818Smartin #endif
450c8b5b21Sisaki 	{ -100, -1.560796660108231, },
460c8b5b21Sisaki 	{  -10, -1.471127674303735, },
470c8b5b21Sisaki 	{   -1, -M_PI / 4, },
480c8b5b21Sisaki 	{ -0.1, -0.09966865249116204, },
490c8b5b21Sisaki 	{  0.1,  0.09966865249116204, },
500c8b5b21Sisaki 	{    1,  M_PI / 4, },
510c8b5b21Sisaki 	{   10,  1.471127674303735, },
520c8b5b21Sisaki 	{  100,  1.560796660108231, },
530c8b5b21Sisaki };
540c8b5b21Sisaki 
55e0a0895cSjruoho /*
56e0a0895cSjruoho  * atan(3)
57e0a0895cSjruoho  */
58a701b24dSdsl ATF_LIBM_TEST(atan_nan, "Test atan/atanf(NaN) == NaN")
59e0a0895cSjruoho {
60*d9c36682Smartin #ifdef T_LIBM_NAN
61a701b24dSdsl 	T_LIBM_CHECK_NAN(0, atan, T_LIBM_NAN);
62a701b24dSdsl 	T_LIBM_CHECK_NAN(0, atanf, T_LIBM_NAN);
63*d9c36682Smartin #else
64*d9c36682Smartin 	atf_tc_skip("no NaN on this machine");
65d97ddb26Smartin #endif
66e0a0895cSjruoho }
67e0a0895cSjruoho 
68a701b24dSdsl ATF_LIBM_TEST(atan_inrange, "Test atan/atanf(x) for some values")
69e0a0895cSjruoho {
70a701b24dSdsl 	unsigned int i;
71e0a0895cSjruoho 
720c8b5b21Sisaki 	for (i = 0; i < __arraycount(values); i++) {
73a701b24dSdsl 		T_LIBM_CHECK(i, atan, values[i].x, values[i].y, 1.0e-15);
74a701b24dSdsl 		T_LIBM_CHECK(i, atanf, values[i].x, values[i].y, 1.0e-7);
75e0a0895cSjruoho 	}
76e0a0895cSjruoho }
77e0a0895cSjruoho 
78a701b24dSdsl ATF_LIBM_TEST(atan_zero_neg, "Test atan/atanf(-0.0) == -0.0")
79e0a0895cSjruoho {
80a701b24dSdsl 
81a701b24dSdsl 	T_LIBM_CHECK_MINUS_ZERO(0, atan, -0.0);
82a701b24dSdsl 	T_LIBM_CHECK_MINUS_ZERO(0, atanf, -0.0);
83e0a0895cSjruoho }
84e0a0895cSjruoho 
85a701b24dSdsl ATF_LIBM_TEST(atan_zero_pos, "Test atan/atanf(+0.0) == +0.0")
86e0a0895cSjruoho {
87e0a0895cSjruoho 
88a701b24dSdsl 	T_LIBM_CHECK_PLUS_ZERO(0, atan, +0.0);
89a701b24dSdsl 	T_LIBM_CHECK_PLUS_ZERO(0, atanf, +0.0);
90e0a0895cSjruoho }
91e0a0895cSjruoho 
ATF_TP_ADD_TCS(tp)92e0a0895cSjruoho ATF_TP_ADD_TCS(tp)
93e0a0895cSjruoho {
94e0a0895cSjruoho 
95e0a0895cSjruoho 	ATF_TP_ADD_TC(tp, atan_nan);
960c8b5b21Sisaki 	ATF_TP_ADD_TC(tp, atan_inrange);
97e0a0895cSjruoho 	ATF_TP_ADD_TC(tp, atan_zero_neg);
98e0a0895cSjruoho 	ATF_TP_ADD_TC(tp, atan_zero_pos);
99e0a0895cSjruoho 
100e0a0895cSjruoho 	return atf_no_error();
101e0a0895cSjruoho }
102