1272343Sngie/* $NetBSD: t_cbrt.c,v 1.3 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_cbrt.c,v 1.3 2014/03/03 10:39:08 martin Exp $"); 33272343Sngie 34272343Sngie#include <atf-c.h> 35272343Sngie#include <math.h> 36272343Sngie#include <stdio.h> 37272343Sngie 38272343Sngie/* 39272343Sngie * cbrt(3) 40272343Sngie */ 41272343SngieATF_TC(cbrt_nan); 42272343SngieATF_TC_HEAD(cbrt_nan, tc) 43272343Sngie{ 44272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrt(NaN) == NaN"); 45272343Sngie} 46272343Sngie 47272343SngieATF_TC_BODY(cbrt_nan, tc) 48272343Sngie{ 49272343Sngie const double x = 0.0L / 0.0L; 50272343Sngie 51272343Sngie ATF_CHECK(isnan(x) != 0); 52272343Sngie ATF_CHECK(isnan(cbrt(x)) != 0); 53272343Sngie} 54272343Sngie 55272343SngieATF_TC(cbrt_pow); 56272343SngieATF_TC_HEAD(cbrt_pow, tc) 57272343Sngie{ 58272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrt(3) vs. pow(3)"); 59272343Sngie} 60272343Sngie 61272343SngieATF_TC_BODY(cbrt_pow, tc) 62272343Sngie{ 63272343Sngie const double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 }; 64272343Sngie const double eps = 1.0e-14; 65272343Sngie double y, z; 66272343Sngie size_t i; 67272343Sngie 68272343Sngie for (i = 0; i < __arraycount(x); i++) { 69272343Sngie 70272343Sngie y = cbrt(x[i]); 71272343Sngie z = pow(x[i], 1.0 / 3.0); 72272343Sngie 73272343Sngie if (fabs(y - z) > eps) 74272343Sngie atf_tc_fail_nonfatal("cbrt(%0.03f) != " 75272343Sngie "pow(%0.03f, 1/3)\n", x[i], x[i]); 76272343Sngie } 77272343Sngie} 78272343Sngie 79272343SngieATF_TC(cbrt_inf_neg); 80272343SngieATF_TC_HEAD(cbrt_inf_neg, tc) 81272343Sngie{ 82272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrt(-Inf) == -Inf"); 83272343Sngie} 84272343Sngie 85272343SngieATF_TC_BODY(cbrt_inf_neg, tc) 86272343Sngie{ 87272343Sngie const double x = -1.0L / 0.0L; 88272343Sngie double y = cbrt(x); 89272343Sngie 90272343Sngie ATF_CHECK(isinf(y) != 0); 91272343Sngie ATF_CHECK(signbit(y) != 0); 92272343Sngie} 93272343Sngie 94272343SngieATF_TC(cbrt_inf_pos); 95272343SngieATF_TC_HEAD(cbrt_inf_pos, tc) 96272343Sngie{ 97272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrt(+Inf) == +Inf"); 98272343Sngie} 99272343Sngie 100272343SngieATF_TC_BODY(cbrt_inf_pos, tc) 101272343Sngie{ 102272343Sngie const double x = 1.0L / 0.0L; 103272343Sngie double y = cbrt(x); 104272343Sngie 105272343Sngie ATF_CHECK(isinf(y) != 0); 106272343Sngie ATF_CHECK(signbit(y) == 0); 107272343Sngie} 108272343Sngie 109272343SngieATF_TC(cbrt_zero_neg); 110272343SngieATF_TC_HEAD(cbrt_zero_neg, tc) 111272343Sngie{ 112272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrt(-0.0) == -0.0"); 113272343Sngie} 114272343Sngie 115272343SngieATF_TC_BODY(cbrt_zero_neg, tc) 116272343Sngie{ 117272343Sngie const double x = -0.0L; 118272343Sngie double y = cbrt(x); 119272343Sngie 120272343Sngie if (fabs(y) > 0.0 || signbit(y) == 0) 121272343Sngie atf_tc_fail_nonfatal("cbrt(-0.0) != -0.0"); 122272343Sngie} 123272343Sngie 124272343SngieATF_TC(cbrt_zero_pos); 125272343SngieATF_TC_HEAD(cbrt_zero_pos, tc) 126272343Sngie{ 127272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrt(+0.0) == +0.0"); 128272343Sngie} 129272343Sngie 130272343SngieATF_TC_BODY(cbrt_zero_pos, tc) 131272343Sngie{ 132272343Sngie const double x = 0.0L; 133272343Sngie double y = cbrt(x); 134272343Sngie 135272343Sngie if (fabs(y) > 0.0 || signbit(y) != 0) 136272343Sngie atf_tc_fail_nonfatal("cbrt(+0.0) != +0.0"); 137272343Sngie} 138272343Sngie 139272343Sngie/* 140272343Sngie * cbrtf(3) 141272343Sngie */ 142272343SngieATF_TC(cbrtf_nan); 143272343SngieATF_TC_HEAD(cbrtf_nan, tc) 144272343Sngie{ 145272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtf(NaN) == NaN"); 146272343Sngie} 147272343Sngie 148272343SngieATF_TC_BODY(cbrtf_nan, tc) 149272343Sngie{ 150272343Sngie const float x = 0.0L / 0.0L; 151272343Sngie 152272343Sngie ATF_CHECK(isnan(x) != 0); 153272343Sngie ATF_CHECK(isnan(cbrtf(x)) != 0); 154272343Sngie} 155272343Sngie 156272343SngieATF_TC(cbrtf_powf); 157272343SngieATF_TC_HEAD(cbrtf_powf, tc) 158272343Sngie{ 159272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtf(3) vs. powf(3)"); 160272343Sngie} 161272343Sngie 162272343SngieATF_TC_BODY(cbrtf_powf, tc) 163272343Sngie{ 164272343Sngie const float x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 }; 165272343Sngie const float eps = 1.0e-5; 166272343Sngie float y, z; 167272343Sngie size_t i; 168272343Sngie 169272343Sngie for (i = 0; i < __arraycount(x); i++) { 170272343Sngie 171272343Sngie y = cbrtf(x[i]); 172272343Sngie z = powf(x[i], 1.0 / 3.0); 173272343Sngie 174272343Sngie if (fabsf(y - z) > eps) 175272343Sngie atf_tc_fail_nonfatal("cbrtf(%0.03f) != " 176272343Sngie "powf(%0.03f, 1/3)\n", x[i], x[i]); 177272343Sngie } 178272343Sngie} 179272343Sngie 180272343SngieATF_TC(cbrtf_inf_neg); 181272343SngieATF_TC_HEAD(cbrtf_inf_neg, tc) 182272343Sngie{ 183272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtf(-Inf) == -Inf"); 184272343Sngie} 185272343Sngie 186272343SngieATF_TC_BODY(cbrtf_inf_neg, tc) 187272343Sngie{ 188272343Sngie const float x = -1.0L / 0.0L; 189272343Sngie float y = cbrtf(x); 190272343Sngie 191272343Sngie ATF_CHECK(isinf(y) != 0); 192272343Sngie ATF_CHECK(signbit(y) != 0); 193272343Sngie} 194272343Sngie 195272343SngieATF_TC(cbrtf_inf_pos); 196272343SngieATF_TC_HEAD(cbrtf_inf_pos, tc) 197272343Sngie{ 198272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtf(+Inf) == +Inf"); 199272343Sngie} 200272343Sngie 201272343SngieATF_TC_BODY(cbrtf_inf_pos, tc) 202272343Sngie{ 203272343Sngie const float x = 1.0L / 0.0L; 204272343Sngie float y = cbrtf(x); 205272343Sngie 206272343Sngie ATF_CHECK(isinf(y) != 0); 207272343Sngie ATF_CHECK(signbit(y) == 0); 208272343Sngie} 209272343Sngie 210272343SngieATF_TC(cbrtf_zero_neg); 211272343SngieATF_TC_HEAD(cbrtf_zero_neg, tc) 212272343Sngie{ 213272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtf(-0.0) == -0.0"); 214272343Sngie} 215272343Sngie 216272343SngieATF_TC_BODY(cbrtf_zero_neg, tc) 217272343Sngie{ 218272343Sngie const float x = -0.0L; 219272343Sngie float y = cbrtf(x); 220272343Sngie 221272343Sngie if (fabsf(y) > 0.0 || signbit(y) == 0) 222272343Sngie atf_tc_fail_nonfatal("cbrtf(-0.0) != -0.0"); 223272343Sngie} 224272343Sngie 225272343SngieATF_TC(cbrtf_zero_pos); 226272343SngieATF_TC_HEAD(cbrtf_zero_pos, tc) 227272343Sngie{ 228272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtf(+0.0) == +0.0"); 229272343Sngie} 230272343Sngie 231272343SngieATF_TC_BODY(cbrtf_zero_pos, tc) 232272343Sngie{ 233272343Sngie const float x = 0.0L; 234272343Sngie float y = cbrtf(x); 235272343Sngie 236272343Sngie if (fabsf(y) > 0.0 || signbit(y) != 0) 237272343Sngie atf_tc_fail_nonfatal("cbrtf(+0.0) != +0.0"); 238272343Sngie} 239272343Sngie 240274601Sngie#if !defined(__FreeBSD__) || LDBL_PREC != 53 241272343Sngie/* 242272343Sngie * cbrtl(3) 243272343Sngie */ 244272343SngieATF_TC(cbrtl_nan); 245272343SngieATF_TC_HEAD(cbrtl_nan, tc) 246272343Sngie{ 247272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtl(NaN) == NaN"); 248272343Sngie} 249272343Sngie 250272343SngieATF_TC_BODY(cbrtl_nan, tc) 251272343Sngie{ 252272343Sngie const long double x = 0.0L / 0.0L; 253272343Sngie 254272343Sngie ATF_CHECK(isnan(x) != 0); 255272343Sngie ATF_CHECK(isnan(cbrtl(x)) != 0); 256272343Sngie} 257272343Sngie 258272343SngieATF_TC(cbrtl_powl); 259272343SngieATF_TC_HEAD(cbrtl_powl, tc) 260272343Sngie{ 261272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtl(3) vs. powl(3)"); 262272343Sngie} 263272343Sngie 264272343SngieATF_TC_BODY(cbrtl_powl, tc) 265272343Sngie{ 266272343Sngie const long double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 }; 267272343Sngie const long double eps = 1.0e-15; 268272343Sngie long double y, z; 269272343Sngie size_t i; 270272343Sngie 271272343Sngie for (i = 0; i < __arraycount(x); i++) { 272272343Sngie 273272343Sngie y = cbrtl(x[i]); 274274601Sngie#ifdef __FreeBSD__ 275274601Sngie z = powl(x[i], (long double)1.0 / 3.0); 276274601Sngie#else 277272343Sngie z = powl(x[i], 1.0 / 3.0); 278274601Sngie#endif 279272343Sngie 280272343Sngie if (fabsl(y - z) > eps * fabsl(1 + x[i])) 281272343Sngie atf_tc_fail_nonfatal("cbrtl(%0.03Lf) != " 282272343Sngie "powl(%0.03Lf, 1/3)\n", x[i], x[i]); 283272343Sngie } 284272343Sngie} 285272343Sngie 286272343SngieATF_TC(cbrtl_inf_neg); 287272343SngieATF_TC_HEAD(cbrtl_inf_neg, tc) 288272343Sngie{ 289272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtl(-Inf) == -Inf"); 290272343Sngie} 291272343Sngie 292272343SngieATF_TC_BODY(cbrtl_inf_neg, tc) 293272343Sngie{ 294272343Sngie const long double x = -1.0L / 0.0L; 295272343Sngie long double y = cbrtl(x); 296272343Sngie 297272343Sngie ATF_CHECK(isinf(y) != 0); 298272343Sngie ATF_CHECK(signbit(y) != 0); 299272343Sngie} 300272343Sngie 301272343SngieATF_TC(cbrtl_inf_pos); 302272343SngieATF_TC_HEAD(cbrtl_inf_pos, tc) 303272343Sngie{ 304272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtl(+Inf) == +Inf"); 305272343Sngie} 306272343Sngie 307272343SngieATF_TC_BODY(cbrtl_inf_pos, tc) 308272343Sngie{ 309272343Sngie const long double x = 1.0L / 0.0L; 310272343Sngie long double y = cbrtl(x); 311272343Sngie 312272343Sngie ATF_CHECK(isinf(y) != 0); 313272343Sngie ATF_CHECK(signbit(y) == 0); 314272343Sngie} 315272343Sngie 316272343SngieATF_TC(cbrtl_zero_neg); 317272343SngieATF_TC_HEAD(cbrtl_zero_neg, tc) 318272343Sngie{ 319272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtl(-0.0) == -0.0"); 320272343Sngie} 321272343Sngie 322272343SngieATF_TC_BODY(cbrtl_zero_neg, tc) 323272343Sngie{ 324272343Sngie const long double x = -0.0L; 325272343Sngie long double y = cbrtl(x); 326272343Sngie 327272343Sngie if (fabsl(y) > 0.0 || signbit(y) == 0) 328272343Sngie atf_tc_fail_nonfatal("cbrtl(-0.0) != -0.0"); 329272343Sngie} 330272343Sngie 331272343SngieATF_TC(cbrtl_zero_pos); 332272343SngieATF_TC_HEAD(cbrtl_zero_pos, tc) 333272343Sngie{ 334272343Sngie atf_tc_set_md_var(tc, "descr", "Test cbrtl(+0.0) == +0.0"); 335272343Sngie} 336272343Sngie 337272343SngieATF_TC_BODY(cbrtl_zero_pos, tc) 338272343Sngie{ 339272343Sngie const long double x = 0.0L; 340272343Sngie long double y = cbrtl(x); 341272343Sngie 342272343Sngie if (fabsl(y) > 0.0 || signbit(y) != 0) 343272343Sngie atf_tc_fail_nonfatal("cbrtl(+0.0) != +0.0"); 344272343Sngie} 345274601Sngie#endif 346272343Sngie 347272343SngieATF_TP_ADD_TCS(tp) 348272343Sngie{ 349272343Sngie 350272343Sngie ATF_TP_ADD_TC(tp, cbrt_nan); 351272343Sngie ATF_TP_ADD_TC(tp, cbrt_pow); 352272343Sngie ATF_TP_ADD_TC(tp, cbrt_inf_neg); 353272343Sngie ATF_TP_ADD_TC(tp, cbrt_inf_pos); 354272343Sngie ATF_TP_ADD_TC(tp, cbrt_zero_neg); 355272343Sngie ATF_TP_ADD_TC(tp, cbrt_zero_pos); 356272343Sngie 357272343Sngie ATF_TP_ADD_TC(tp, cbrtf_nan); 358272343Sngie ATF_TP_ADD_TC(tp, cbrtf_powf); 359272343Sngie ATF_TP_ADD_TC(tp, cbrtf_inf_neg); 360272343Sngie ATF_TP_ADD_TC(tp, cbrtf_inf_pos); 361272343Sngie ATF_TP_ADD_TC(tp, cbrtf_zero_neg); 362272343Sngie ATF_TP_ADD_TC(tp, cbrtf_zero_pos); 363272343Sngie 364274601Sngie#if !defined(__FreeBSD__) || LDBL_PREC != 53 365272343Sngie ATF_TP_ADD_TC(tp, cbrtl_nan); 366272343Sngie ATF_TP_ADD_TC(tp, cbrtl_powl); 367272343Sngie ATF_TP_ADD_TC(tp, cbrtl_inf_neg); 368272343Sngie ATF_TP_ADD_TC(tp, cbrtl_inf_pos); 369272343Sngie ATF_TP_ADD_TC(tp, cbrtl_zero_neg); 370272343Sngie ATF_TP_ADD_TC(tp, cbrtl_zero_pos); 371274601Sngie#endif 372272343Sngie 373272343Sngie return atf_no_error(); 374272343Sngie} 375