Home | History | Annotate | Line # | Download | only in libm
t_sincos.c revision 1.1
      1  1.1  christos /* $NetBSD: t_sincos.c,v 1.1 2022/08/27 08:31:58 christos Exp $ */
      2  1.1  christos 
      3  1.1  christos /*-
      4  1.1  christos  * Copyright (c) 2011, 2022 The NetBSD Foundation, Inc.
      5  1.1  christos  * All rights reserved.
      6  1.1  christos  *
      7  1.1  christos  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1  christos  * by Jukka Ruohonen and Christos Zoulas
      9  1.1  christos  *
     10  1.1  christos  * Redistribution and use in source and binary forms, with or without
     11  1.1  christos  * modification, are permitted provided that the following conditions
     12  1.1  christos  * are met:
     13  1.1  christos  * 1. Redistributions of source code must retain the above copyright
     14  1.1  christos  *    notice, this list of conditions and the following disclaimer.
     15  1.1  christos  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  christos  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  christos  *    documentation and/or other materials provided with the distribution.
     18  1.1  christos  *
     19  1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  1.1  christos  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  1.1  christos  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  1.1  christos  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  1.1  christos  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  1.1  christos  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  1.1  christos  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  1.1  christos  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  1.1  christos  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  1.1  christos  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  1.1  christos  * POSSIBILITY OF SUCH DAMAGE.
     30  1.1  christos  */
     31  1.1  christos 
     32  1.1  christos #include <assert.h>
     33  1.1  christos #include <atf-c.h>
     34  1.1  christos #include <float.h>
     35  1.1  christos #include <math.h>
     36  1.1  christos #include <stdio.h>
     37  1.1  christos 
     38  1.1  christos static const struct {
     39  1.1  christos 	int		angle;
     40  1.1  christos 	double		x;
     41  1.1  christos 	double		y;
     42  1.1  christos 	float		fy;
     43  1.1  christos } sin_angles[] = {
     44  1.1  christos //	{ -360, -6.283185307179586,  2.4492935982947064e-16, -1.7484555e-07 },
     45  1.1  christos 	{ -180, -3.141592653589793, -1.2246467991473532e-16, 8.7422777e-08 },
     46  1.1  christos 	{ -135, -2.356194490192345, -0.7071067811865476, 999 },
     47  1.1  christos //	{  -90, -1.570796326794897, -1.0000000000000000, 999 },
     48  1.1  christos 	{  -45, -0.785398163397448, -0.7071067811865472, 999 },
     49  1.1  christos 	{    0,  0.000000000000000,  0.0000000000000000, 999 },
     50  1.1  christos 	{   30,  0.5235987755982989, 0.5000000000000000, 999 },
     51  1.1  christos 	{   45,  0.785398163397448,  0.7071067811865472, 999 },
     52  1.1  christos //	{   60,  1.047197551196598,  0.8660254037844388, 999 },
     53  1.1  christos 	{   90,  1.570796326794897,  1.0000000000000000, 999 },
     54  1.1  christos //	{  120,  2.094395102393195,  0.8660254037844389, 999 },
     55  1.1  christos 	{  135,  2.356194490192345,  0.7071067811865476, 999 },
     56  1.1  christos 	{  150,  2.617993877991494,  0.5000000000000003, 999 },
     57  1.1  christos 	{  180,  3.141592653589793,  1.2246467991473532e-16, -8.7422777e-08 },
     58  1.1  christos 	{  270,  4.712388980384690, -1.0000000000000000, 999 },
     59  1.1  christos 	{  360,  6.283185307179586, -2.4492935982947064e-16, 1.7484555e-07 },
     60  1.1  christos };
     61  1.1  christos 
     62  1.1  christos static const struct {
     63  1.1  christos 	int		angle;
     64  1.1  christos 	double		x;
     65  1.1  christos 	double		y;
     66  1.1  christos 	float		fy;
     67  1.1  christos } cos_angles[] = {
     68  1.1  christos 	{ -180, -3.141592653589793, -1.0000000000000000, 999 },
     69  1.1  christos 	{ -135, -2.356194490192345, -0.7071067811865476, 999 },
     70  1.1  christos //	{  -90, -1.5707963267948966, 6.123233995736766e-17, -4.3711388e-08 },
     71  1.1  christos //	{  -90, -1.5707963267948968, -1.6081226496766366e-16, -4.3711388e-08 },
     72  1.1  christos 	{  -45, -0.785398163397448,  0.7071067811865478, 999 },
     73  1.1  christos 	{    0,  0.000000000000000,  1.0000000000000000, 999 },
     74  1.1  christos 	{   30,  0.5235987755982989, 0.8660254037844386, 999 },
     75  1.1  christos 	{   45,  0.785398163397448,  0.7071067811865478, 999 },
     76  1.1  christos //	{   60,  1.0471975511965976,  0.5000000000000001, 999 },
     77  1.1  christos //	{   60,  1.0471975511965979,  0.4999999999999999, 999 },
     78  1.1  christos 	{   90,  1.570796326794897, -3.8285686989269494e-16, -4.3711388e-08 },
     79  1.1  christos //	{  120,  2.0943951023931953, -0.4999999999999998, 999 },
     80  1.1  christos //	{  120,  2.0943951023931957, -0.5000000000000002, 999 },
     81  1.1  christos 	{  135,  2.356194490192345, -0.7071067811865476, 999 },
     82  1.1  christos 	{  150,  2.617993877991494, -0.8660254037844386, 999 },
     83  1.1  christos 	{  180,  3.141592653589793, -1.0000000000000000, 999 },
     84  1.1  christos 	{  270,  4.712388980384690, -1.8369701987210297e-16, 1.1924881e-08 },
     85  1.1  christos 	{  360,  6.283185307179586,  1.0000000000000000, 999 },
     86  1.1  christos };
     87  1.1  christos 
     88  1.1  christos #ifdef __HAVE_LONG_DOUBLE
     89  1.1  christos /*
     90  1.1  christos  * sincosl(3)
     91  1.1  christos  */
     92  1.1  christos ATF_TC(sincosl_angles);
     93  1.1  christos ATF_TC_HEAD(sincosl_angles, tc)
     94  1.1  christos {
     95  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test some selected angles");
     96  1.1  christos }
     97  1.1  christos 
     98  1.1  christos ATF_TC_BODY(sincosl_angles, tc)
     99  1.1  christos {
    100  1.1  christos 	/*
    101  1.1  christos 	 * XXX The given data is for double, so take that
    102  1.1  christos 	 * into account and expect less precise results..
    103  1.1  christos 	 */
    104  1.1  christos 	const long double eps = DBL_EPSILON;
    105  1.1  christos 	size_t i;
    106  1.1  christos 
    107  1.1  christos 	ATF_CHECK(__arraycount(sin_angles) == __arraycount(cos_angles));
    108  1.1  christos 
    109  1.1  christos 	for (i = 0; i < __arraycount(sin_angles); i++) {
    110  1.1  christos 		ATF_CHECK_MSG(sin_angles[i].angle == cos_angles[i].angle,
    111  1.1  christos 		    "%zu %d %d", i, sin_angles[i].angle, cos_angles[i].angle);
    112  1.1  christos 		int deg = sin_angles[i].angle;
    113  1.1  christos 		ATF_CHECK_MSG(sin_angles[i].x == cos_angles[i].x,
    114  1.1  christos 		    "%zu %g %g", i, sin_angles[i].x, cos_angles[i].x);
    115  1.1  christos 		long double theta = sin_angles[i].x;
    116  1.1  christos 		long double sin_theta = sin_angles[i].y;
    117  1.1  christos 		long double cos_theta = cos_angles[i].y;
    118  1.1  christos 		long double s, c;
    119  1.1  christos 
    120  1.1  christos 		sincosl(theta, &s, &c);
    121  1.1  christos 
    122  1.1  christos 		if (fabsl((s - sin_theta)/sin_theta) > eps) {
    123  1.1  christos 			atf_tc_fail_nonfatal("sin(%d deg = %.17Lg) = %.17Lg"
    124  1.1  christos 			    " != %.17Lg",
    125  1.1  christos 			    deg, theta, s, sin_theta);
    126  1.1  christos 		}
    127  1.1  christos 		if (fabsl((c - cos_theta)/cos_theta) > eps) {
    128  1.1  christos 			atf_tc_fail_nonfatal("cos(%d deg = %.17Lg) = %.17Lg"
    129  1.1  christos 			    " != %.17Lg",
    130  1.1  christos 			    deg, theta, c, cos_theta);
    131  1.1  christos 		}
    132  1.1  christos 	}
    133  1.1  christos }
    134  1.1  christos 
    135  1.1  christos ATF_TC(sincosl_nan);
    136  1.1  christos ATF_TC_HEAD(sincosl_nan, tc)
    137  1.1  christos {
    138  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosl(NaN) == (NaN, NaN)");
    139  1.1  christos }
    140  1.1  christos 
    141  1.1  christos ATF_TC_BODY(sincosl_nan, tc)
    142  1.1  christos {
    143  1.1  christos 	const long double x = 0.0L / 0.0L;
    144  1.1  christos 	long double s, c;
    145  1.1  christos 
    146  1.1  christos 	sincosl(x, &s, &c);
    147  1.1  christos 	ATF_CHECK(isnan(x) && isnan(s) && isnan(c));
    148  1.1  christos }
    149  1.1  christos 
    150  1.1  christos ATF_TC(sincosl_inf_neg);
    151  1.1  christos ATF_TC_HEAD(sincosl_inf_neg, tc)
    152  1.1  christos {
    153  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosl(-Inf) == (NaN, NaN)");
    154  1.1  christos }
    155  1.1  christos 
    156  1.1  christos ATF_TC_BODY(sincosl_inf_neg, tc)
    157  1.1  christos {
    158  1.1  christos 	const long double x = -1.0L / 0.0L;
    159  1.1  christos 	long double s, c;
    160  1.1  christos 
    161  1.1  christos 	sincosl(x, &s, &c);
    162  1.1  christos 	ATF_CHECK(isnan(s) && isnan(c));
    163  1.1  christos }
    164  1.1  christos 
    165  1.1  christos ATF_TC(sincosl_inf_pos);
    166  1.1  christos ATF_TC_HEAD(sincosl_inf_pos, tc)
    167  1.1  christos {
    168  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosl(+Inf) == (NaN, NaN)");
    169  1.1  christos }
    170  1.1  christos 
    171  1.1  christos ATF_TC_BODY(sincosl_inf_pos, tc)
    172  1.1  christos {
    173  1.1  christos 	const long double x = 1.0L / 0.0L;
    174  1.1  christos 	long double s, c;
    175  1.1  christos 
    176  1.1  christos 	sincosl(x, &s, &c);
    177  1.1  christos 	ATF_CHECK(isnan(s) && isnan(c));
    178  1.1  christos }
    179  1.1  christos 
    180  1.1  christos 
    181  1.1  christos ATF_TC(sincosl_zero_neg);
    182  1.1  christos ATF_TC_HEAD(sincosl_zero_neg, tc)
    183  1.1  christos {
    184  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosl(-0.0) == (0.0, 1.0)");
    185  1.1  christos }
    186  1.1  christos 
    187  1.1  christos ATF_TC_BODY(sincosl_zero_neg, tc)
    188  1.1  christos {
    189  1.1  christos 	const long double x = -0.0L;
    190  1.1  christos 	long double s, c;
    191  1.1  christos 
    192  1.1  christos 	sincosl(x, &s, &c);
    193  1.1  christos 	ATF_CHECK(s == 0.0 && c == 1.0);
    194  1.1  christos }
    195  1.1  christos 
    196  1.1  christos ATF_TC(sincosl_zero_pos);
    197  1.1  christos ATF_TC_HEAD(sincosl_zero_pos, tc)
    198  1.1  christos {
    199  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosl(+0.0) == (0.0, 1.0)");
    200  1.1  christos }
    201  1.1  christos 
    202  1.1  christos ATF_TC_BODY(sincosl_zero_pos, tc)
    203  1.1  christos {
    204  1.1  christos 	const long double x = 0.0L;
    205  1.1  christos 	long double s, c;
    206  1.1  christos 
    207  1.1  christos 	sincosl(x, &s, &c);
    208  1.1  christos 	ATF_CHECK(s == 0.0 && c == 1.0);
    209  1.1  christos }
    210  1.1  christos #endif
    211  1.1  christos 
    212  1.1  christos /*
    213  1.1  christos  * sincos(3)
    214  1.1  christos  */
    215  1.1  christos ATF_TC(sincos_angles);
    216  1.1  christos ATF_TC_HEAD(sincos_angles, tc)
    217  1.1  christos {
    218  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test some selected angles");
    219  1.1  christos }
    220  1.1  christos 
    221  1.1  christos ATF_TC_BODY(sincos_angles, tc)
    222  1.1  christos {
    223  1.1  christos 	const double eps = DBL_EPSILON;
    224  1.1  christos 	size_t i;
    225  1.1  christos 
    226  1.1  christos 	for (i = 0; i < __arraycount(sin_angles); i++) {
    227  1.1  christos 		ATF_CHECK_MSG(sin_angles[i].angle == cos_angles[i].angle,
    228  1.1  christos 		    "%zu %d %d", i, sin_angles[i].angle, cos_angles[i].angle);
    229  1.1  christos 		int deg = sin_angles[i].angle;
    230  1.1  christos 		ATF_CHECK_MSG(sin_angles[i].x == cos_angles[i].x,
    231  1.1  christos 		    "%zu %g %g", i, sin_angles[i].x, cos_angles[i].x);
    232  1.1  christos 		double theta = sin_angles[i].x;
    233  1.1  christos 		double sin_theta = sin_angles[i].y;
    234  1.1  christos 		double cos_theta = cos_angles[i].y;
    235  1.1  christos 		double s, c;
    236  1.1  christos 
    237  1.1  christos 		sincos(theta, &s, &c);
    238  1.1  christos 
    239  1.1  christos 		if (fabs((s - sin_theta)/sin_theta) > eps) {
    240  1.1  christos 			atf_tc_fail_nonfatal("sin(%d deg = %.17g) = %.17g"
    241  1.1  christos 			    " != %.17g",
    242  1.1  christos 			    deg, theta, s, sin_theta);
    243  1.1  christos 		}
    244  1.1  christos 		if (fabs((c - cos_theta)/cos_theta) > eps) {
    245  1.1  christos 			atf_tc_fail_nonfatal("cos(%d deg = %.17g) = %.17g"
    246  1.1  christos 			    " != %.17g",
    247  1.1  christos 			    deg, theta, c, cos_theta);
    248  1.1  christos 		}
    249  1.1  christos 	}
    250  1.1  christos }
    251  1.1  christos 
    252  1.1  christos ATF_TC(sincos_nan);
    253  1.1  christos ATF_TC_HEAD(sincos_nan, tc)
    254  1.1  christos {
    255  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincos(NaN) == (NaN, NaN)");
    256  1.1  christos }
    257  1.1  christos 
    258  1.1  christos ATF_TC_BODY(sincos_nan, tc)
    259  1.1  christos {
    260  1.1  christos 	const double x = 0.0L / 0.0L;
    261  1.1  christos 	double s, c;
    262  1.1  christos 
    263  1.1  christos 	sincos(x, &s, &c);
    264  1.1  christos 	ATF_CHECK(isnan(x) && isnan(s) && isnan(c));
    265  1.1  christos }
    266  1.1  christos 
    267  1.1  christos ATF_TC(sincos_inf_neg);
    268  1.1  christos ATF_TC_HEAD(sincos_inf_neg, tc)
    269  1.1  christos {
    270  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincos(-Inf) == (NaN, NaN)");
    271  1.1  christos }
    272  1.1  christos 
    273  1.1  christos ATF_TC_BODY(sincos_inf_neg, tc)
    274  1.1  christos {
    275  1.1  christos 	const double x = -1.0L / 0.0L;
    276  1.1  christos 	double s, c;
    277  1.1  christos 
    278  1.1  christos 	sincos(x, &s, &c);
    279  1.1  christos 	ATF_CHECK(isnan(s) && isnan(c));
    280  1.1  christos }
    281  1.1  christos 
    282  1.1  christos ATF_TC(sincos_inf_pos);
    283  1.1  christos ATF_TC_HEAD(sincos_inf_pos, tc)
    284  1.1  christos {
    285  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincos(+Inf) == (NaN, NaN)");
    286  1.1  christos }
    287  1.1  christos 
    288  1.1  christos ATF_TC_BODY(sincos_inf_pos, tc)
    289  1.1  christos {
    290  1.1  christos 	const double x = 1.0L / 0.0L;
    291  1.1  christos 	double s, c;
    292  1.1  christos 
    293  1.1  christos 	sincos(x, &s, &c);
    294  1.1  christos 	ATF_CHECK(isnan(s) && isnan(c));
    295  1.1  christos }
    296  1.1  christos 
    297  1.1  christos 
    298  1.1  christos ATF_TC(sincos_zero_neg);
    299  1.1  christos ATF_TC_HEAD(sincos_zero_neg, tc)
    300  1.1  christos {
    301  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincos(-0.0) == (0.0, 1.0)");
    302  1.1  christos }
    303  1.1  christos 
    304  1.1  christos ATF_TC_BODY(sincos_zero_neg, tc)
    305  1.1  christos {
    306  1.1  christos 	const double x = -0.0L;
    307  1.1  christos 	double s, c;
    308  1.1  christos 
    309  1.1  christos 	sincos(x, &s, &c);
    310  1.1  christos 	ATF_CHECK(s == 0 && c == 1.0);
    311  1.1  christos }
    312  1.1  christos 
    313  1.1  christos ATF_TC(sincos_zero_pos);
    314  1.1  christos ATF_TC_HEAD(sincos_zero_pos, tc)
    315  1.1  christos {
    316  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test cos(+0.0) == (0.0, 1.0)");
    317  1.1  christos }
    318  1.1  christos 
    319  1.1  christos ATF_TC_BODY(sincos_zero_pos, tc)
    320  1.1  christos {
    321  1.1  christos 	const double x = 0.0L;
    322  1.1  christos 	double s, c;
    323  1.1  christos 
    324  1.1  christos 	sincos(x, &s, &c);
    325  1.1  christos 	ATF_CHECK(s == 0 && c == 1.0);
    326  1.1  christos }
    327  1.1  christos 
    328  1.1  christos /*
    329  1.1  christos  * sincosf(3)
    330  1.1  christos  */
    331  1.1  christos ATF_TC(sincosf_angles);
    332  1.1  christos ATF_TC_HEAD(sincosf_angles, tc)
    333  1.1  christos {
    334  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test some selected angles");
    335  1.1  christos }
    336  1.1  christos 
    337  1.1  christos ATF_TC_BODY(sincosf_angles, tc)
    338  1.1  christos {
    339  1.1  christos 	const float eps = FLT_EPSILON;
    340  1.1  christos 	size_t i;
    341  1.1  christos 
    342  1.1  christos 	for (i = 0; i < __arraycount(sin_angles); i++) {
    343  1.1  christos 		ATF_CHECK_MSG(sin_angles[i].angle == cos_angles[i].angle,
    344  1.1  christos 		    "%zu %d %d", i, sin_angles[i].angle, cos_angles[i].angle);
    345  1.1  christos 		int deg = sin_angles[i].angle;
    346  1.1  christos 		ATF_CHECK_MSG(sin_angles[i].x == cos_angles[i].x,
    347  1.1  christos 		    "%zu %g %g", i, sin_angles[i].x, cos_angles[i].x);
    348  1.1  christos 		float theta = sin_angles[i].x;
    349  1.1  christos 		float sin_theta = sin_angles[i].fy;
    350  1.1  christos 		float cos_theta = cos_angles[i].fy;
    351  1.1  christos 		float s, c;
    352  1.1  christos 
    353  1.1  christos 		sincosf(theta, &s, &c);
    354  1.1  christos 		if (cos_theta == 999)
    355  1.1  christos 			cos_theta = cos_angles[i].y;
    356  1.1  christos 		if (sin_theta == 999)
    357  1.1  christos 			sin_theta = sin_angles[i].y;
    358  1.1  christos 
    359  1.1  christos 		if (fabs((s - sin_theta)/sin_theta) > eps) {
    360  1.1  christos 			atf_tc_fail_nonfatal("sin(%d deg = %.8g) = %.8g"
    361  1.1  christos 			    " != %.8g",
    362  1.1  christos 			    deg, theta, s, sin_theta);
    363  1.1  christos 		}
    364  1.1  christos 		if (fabs((c - cos_theta)/cos_theta) > eps) {
    365  1.1  christos 			atf_tc_fail_nonfatal("cos(%d deg = %.8g) = %.8g"
    366  1.1  christos 			    " != %.8g",
    367  1.1  christos 			    deg, theta, c, cos_theta);
    368  1.1  christos 		}
    369  1.1  christos 	}
    370  1.1  christos }
    371  1.1  christos 
    372  1.1  christos ATF_TC(sincosf_nan);
    373  1.1  christos ATF_TC_HEAD(sincosf_nan, tc)
    374  1.1  christos {
    375  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test cosf(NaN) == (NaN, NaN)");
    376  1.1  christos }
    377  1.1  christos 
    378  1.1  christos ATF_TC_BODY(sincosf_nan, tc)
    379  1.1  christos {
    380  1.1  christos 	const float x = 0.0L / 0.0L;
    381  1.1  christos 	float s, c;
    382  1.1  christos 
    383  1.1  christos 	sincosf(x, &s, &c);
    384  1.1  christos 	ATF_CHECK(isnan(x) && isnan(s) && isnan(c));
    385  1.1  christos }
    386  1.1  christos 
    387  1.1  christos ATF_TC(sincosf_inf_neg);
    388  1.1  christos ATF_TC_HEAD(sincosf_inf_neg, tc)
    389  1.1  christos {
    390  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test cosf(-Inf) == (NaN, NaN)");
    391  1.1  christos }
    392  1.1  christos 
    393  1.1  christos ATF_TC_BODY(sincosf_inf_neg, tc)
    394  1.1  christos {
    395  1.1  christos 	const float x = -1.0L / 0.0L;
    396  1.1  christos 	float s, c;
    397  1.1  christos 
    398  1.1  christos 	sincosf(x, &s, &c);
    399  1.1  christos 	ATF_CHECK(isnan(s) && isnan(c));
    400  1.1  christos 
    401  1.1  christos }
    402  1.1  christos 
    403  1.1  christos ATF_TC(sincosf_inf_pos);
    404  1.1  christos ATF_TC_HEAD(sincosf_inf_pos, tc)
    405  1.1  christos {
    406  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosf(+Inf) == (NaN, NaN)");
    407  1.1  christos }
    408  1.1  christos 
    409  1.1  christos ATF_TC_BODY(sincosf_inf_pos, tc)
    410  1.1  christos {
    411  1.1  christos 	const float x = 1.0L / 0.0L;
    412  1.1  christos 	float s, c;
    413  1.1  christos 
    414  1.1  christos 	sincosf(x, &s, &c);
    415  1.1  christos 	ATF_CHECK(isnan(s) && isnan(c));
    416  1.1  christos }
    417  1.1  christos 
    418  1.1  christos 
    419  1.1  christos ATF_TC(sincosf_zero_neg);
    420  1.1  christos ATF_TC_HEAD(sincosf_zero_neg, tc)
    421  1.1  christos {
    422  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosf(-0.0) == (0.0, 1.0)");
    423  1.1  christos }
    424  1.1  christos 
    425  1.1  christos ATF_TC_BODY(sincosf_zero_neg, tc)
    426  1.1  christos {
    427  1.1  christos 	const float x = -0.0L;
    428  1.1  christos 	float s, c;
    429  1.1  christos 
    430  1.1  christos 	sincosf(x, &s, &c);
    431  1.1  christos 
    432  1.1  christos 	ATF_CHECK(s == 0.0 && c == 1.0);
    433  1.1  christos }
    434  1.1  christos 
    435  1.1  christos ATF_TC(sincosf_zero_pos);
    436  1.1  christos ATF_TC_HEAD(sincosf_zero_pos, tc)
    437  1.1  christos {
    438  1.1  christos 	atf_tc_set_md_var(tc, "descr", "Test sincosf(+0.0) == (0.0, 1.0)");
    439  1.1  christos }
    440  1.1  christos 
    441  1.1  christos ATF_TC_BODY(sincosf_zero_pos, tc)
    442  1.1  christos {
    443  1.1  christos 	const float x = 0.0L;
    444  1.1  christos 
    445  1.1  christos 	float s, c;
    446  1.1  christos 
    447  1.1  christos 	sincosf(x, &s, &c);
    448  1.1  christos 
    449  1.1  christos 	ATF_CHECK(s == 0 && c == 1.0);
    450  1.1  christos }
    451  1.1  christos 
    452  1.1  christos ATF_TP_ADD_TCS(tp)
    453  1.1  christos {
    454  1.1  christos #ifdef __HAVE_LONG_DOUBLE
    455  1.1  christos 	ATF_TP_ADD_TC(tp, sincosl_angles);
    456  1.1  christos 	ATF_TP_ADD_TC(tp, sincosl_nan);
    457  1.1  christos 	ATF_TP_ADD_TC(tp, sincosl_inf_neg);
    458  1.1  christos 	ATF_TP_ADD_TC(tp, sincosl_inf_pos);
    459  1.1  christos 	ATF_TP_ADD_TC(tp, sincosl_zero_neg);
    460  1.1  christos 	ATF_TP_ADD_TC(tp, sincosl_zero_pos);
    461  1.1  christos #endif
    462  1.1  christos 
    463  1.1  christos 	ATF_TP_ADD_TC(tp, sincos_angles);
    464  1.1  christos 	ATF_TP_ADD_TC(tp, sincos_nan);
    465  1.1  christos 	ATF_TP_ADD_TC(tp, sincos_inf_neg);
    466  1.1  christos 	ATF_TP_ADD_TC(tp, sincos_inf_pos);
    467  1.1  christos 	ATF_TP_ADD_TC(tp, sincos_zero_neg);
    468  1.1  christos 	ATF_TP_ADD_TC(tp, sincos_zero_pos);
    469  1.1  christos 
    470  1.1  christos 	ATF_TP_ADD_TC(tp, sincosf_angles);
    471  1.1  christos 	ATF_TP_ADD_TC(tp, sincosf_nan);
    472  1.1  christos 	ATF_TP_ADD_TC(tp, sincosf_inf_neg);
    473  1.1  christos 	ATF_TP_ADD_TC(tp, sincosf_inf_pos);
    474  1.1  christos 	ATF_TP_ADD_TC(tp, sincosf_zero_neg);
    475  1.1  christos 	ATF_TP_ADD_TC(tp, sincosf_zero_pos);
    476  1.1  christos 
    477  1.1  christos 	return atf_no_error();
    478  1.1  christos }
    479