1 1.18 riastrad /* $NetBSD: t_scalbn.c,v 1.18 2024/06/09 16:53:12 riastradh Exp $ */ 2 1.1 jruoho 3 1.1 jruoho /*- 4 1.1 jruoho * Copyright (c) 2011 The NetBSD Foundation, Inc. 5 1.1 jruoho * All rights reserved. 6 1.1 jruoho * 7 1.1 jruoho * This code is derived from software contributed to The NetBSD Foundation 8 1.1 jruoho * by Jukka Ruohonen. 9 1.1 jruoho * 10 1.1 jruoho * Redistribution and use in source and binary forms, with or without 11 1.1 jruoho * modification, are permitted provided that the following conditions 12 1.1 jruoho * are met: 13 1.1 jruoho * 1. Redistributions of source code must retain the above copyright 14 1.1 jruoho * notice, this list of conditions and the following disclaimer. 15 1.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 jruoho * notice, this list of conditions and the following disclaimer in the 17 1.1 jruoho * documentation and/or other materials provided with the distribution. 18 1.1 jruoho * 19 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 jruoho * POSSIBILITY OF SUCH DAMAGE. 30 1.1 jruoho */ 31 1.1 jruoho #include <sys/cdefs.h> 32 1.18 riastrad __RCSID("$NetBSD: t_scalbn.c,v 1.18 2024/06/09 16:53:12 riastradh Exp $"); 33 1.1 jruoho 34 1.1 jruoho #include <math.h> 35 1.1 jruoho #include <limits.h> 36 1.8 martin #include <float.h> 37 1.8 martin #include <errno.h> 38 1.15 maya #include <fenv.h> 39 1.1 jruoho 40 1.1 jruoho #include <atf-c.h> 41 1.1 jruoho 42 1.1 jruoho static const int exps[] = { 0, 1, -1, 100, -100 }; 43 1.1 jruoho 44 1.8 martin /* tests here do not require specific precision, so we just use double */ 45 1.8 martin struct testcase { 46 1.8 martin int exp; 47 1.8 martin double inval; 48 1.8 martin double result; 49 1.8 martin int error; 50 1.15 maya int except; 51 1.8 martin }; 52 1.8 martin struct testcase test_vals[] = { 53 1.15 maya { 0, 1.00085, 1.00085, 0, 0 }, 54 1.15 maya { 0, 0.99755, 0.99755, 0, 0 }, 55 1.15 maya { 0, -1.00085, -1.00085, 0, 0 }, 56 1.15 maya { 0, -0.99755, -0.99755, 0, 0 }, 57 1.15 maya { 1, 1.00085, 2.0* 1.00085, 0, 0 }, 58 1.15 maya { 1, 0.99755, 2.0* 0.99755, 0, 0 }, 59 1.15 maya { 1, -1.00085, 2.0* -1.00085, 0, 0 }, 60 1.15 maya { 1, -0.99755, 2.0* -0.99755, 0, 0 }, 61 1.8 martin 62 1.8 martin /* 63 1.8 martin * We could add more corner test cases here, but we would have to 64 1.8 martin * add some ifdefs for the exact format and use a reliable 65 1.8 martin * generator program - bail for now and only do trivial stuff above. 66 1.8 martin */ 67 1.8 martin }; 68 1.8 martin 69 1.1 jruoho /* 70 1.1 jruoho * scalbn(3) 71 1.1 jruoho */ 72 1.8 martin ATF_TC(scalbn_val); 73 1.8 martin ATF_TC_HEAD(scalbn_val, tc) 74 1.8 martin { 75 1.8 martin atf_tc_set_md_var(tc, "descr", "Test scalbn() for a few values"); 76 1.8 martin } 77 1.8 martin 78 1.8 martin ATF_TC_BODY(scalbn_val, tc) 79 1.8 martin { 80 1.8 martin const struct testcase *tests = test_vals; 81 1.8 martin const size_t tcnt = __arraycount(test_vals); 82 1.8 martin size_t i; 83 1.8 martin double rv; 84 1.8 martin 85 1.8 martin for (i = 0; i < tcnt; i++) { 86 1.14 agc errno = 0; 87 1.15 maya #ifndef __vax__ 88 1.15 maya feclearexcept(FE_ALL_EXCEPT); 89 1.15 maya #endif 90 1.8 martin rv = scalbn(tests[i].inval, tests[i].exp); 91 1.8 martin ATF_CHECK_EQ_MSG(errno, tests[i].error, 92 1.8 martin "test %zu: errno %d instead of %d", i, errno, 93 1.8 martin tests[i].error); 94 1.15 maya #ifndef __vax__ 95 1.15 maya ATF_CHECK_EQ_MSG(errno, tests[i].error, 96 1.15 maya "test %zu: fetestexcept %d instead of %d", i, 97 1.15 maya fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW), 98 1.15 maya tests[i].except); 99 1.15 maya #endif 100 1.16 riastrad /* scalbn is always exact except for underflow or overflow. */ 101 1.16 riastrad ATF_CHECK_MSG(rv == tests[i].result, 102 1.16 riastrad "test %zu: return value %.17g instead of %.17g" 103 1.16 riastrad " (error %.17g)", 104 1.16 riastrad i, rv, tests[i].result, 105 1.16 riastrad fabs((tests[i].result - rv)/tests[i].result)); 106 1.8 martin } 107 1.8 martin } 108 1.8 martin 109 1.1 jruoho ATF_TC(scalbn_nan); 110 1.1 jruoho ATF_TC_HEAD(scalbn_nan, tc) 111 1.1 jruoho { 112 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbn(NaN, n) == NaN"); 113 1.1 jruoho } 114 1.1 jruoho 115 1.1 jruoho ATF_TC_BODY(scalbn_nan, tc) 116 1.1 jruoho { 117 1.1 jruoho const double x = 0.0L / 0.0L; 118 1.1 jruoho double y; 119 1.1 jruoho size_t i; 120 1.1 jruoho 121 1.2 jruoho ATF_REQUIRE(isnan(x) != 0); 122 1.2 jruoho 123 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) { 124 1.1 jruoho y = scalbn(x, exps[i]); 125 1.1 jruoho ATF_CHECK(isnan(y) != 0); 126 1.1 jruoho } 127 1.1 jruoho } 128 1.1 jruoho 129 1.1 jruoho ATF_TC(scalbn_inf_neg); 130 1.1 jruoho ATF_TC_HEAD(scalbn_inf_neg, tc) 131 1.1 jruoho { 132 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbn(-Inf, n) == -Inf"); 133 1.1 jruoho } 134 1.1 jruoho 135 1.1 jruoho ATF_TC_BODY(scalbn_inf_neg, tc) 136 1.1 jruoho { 137 1.1 jruoho const double x = -1.0L / 0.0L; 138 1.1 jruoho size_t i; 139 1.1 jruoho 140 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) 141 1.1 jruoho ATF_CHECK(scalbn(x, exps[i]) == x); 142 1.1 jruoho } 143 1.1 jruoho 144 1.1 jruoho ATF_TC(scalbn_inf_pos); 145 1.1 jruoho ATF_TC_HEAD(scalbn_inf_pos, tc) 146 1.1 jruoho { 147 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbn(+Inf, n) == +Inf"); 148 1.1 jruoho } 149 1.1 jruoho 150 1.1 jruoho ATF_TC_BODY(scalbn_inf_pos, tc) 151 1.1 jruoho { 152 1.1 jruoho const double x = 1.0L / 0.0L; 153 1.1 jruoho size_t i; 154 1.1 jruoho 155 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) 156 1.1 jruoho ATF_CHECK(scalbn(x, exps[i]) == x); 157 1.1 jruoho } 158 1.1 jruoho 159 1.6 jruoho ATF_TC(scalbn_ldexp); 160 1.6 jruoho ATF_TC_HEAD(scalbn_ldexp, tc) 161 1.6 jruoho { 162 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbn(x, n) == ldexp(x, n)"); 163 1.6 jruoho } 164 1.6 jruoho 165 1.6 jruoho ATF_TC_BODY(scalbn_ldexp, tc) 166 1.6 jruoho { 167 1.6 jruoho #if FLT_RADIX == 2 168 1.6 jruoho const double x = 2.91288191221812821; 169 1.6 jruoho double y; 170 1.6 jruoho size_t i; 171 1.6 jruoho 172 1.6 jruoho for (i = 0; i < __arraycount(exps); i++) { 173 1.6 jruoho y = scalbn(x, exps[i]); 174 1.8 martin ATF_CHECK_MSG(y == ldexp(x, exps[i]), "test %zu: exponent=%d, " 175 1.8 martin "y=%g, expected %g (diff: %g)", i, exps[i], y, 176 1.8 martin ldexp(x, exps[i]), y - ldexp(x, exps[i])); 177 1.6 jruoho } 178 1.6 jruoho #endif 179 1.6 jruoho } 180 1.6 jruoho 181 1.1 jruoho ATF_TC(scalbn_zero_neg); 182 1.1 jruoho ATF_TC_HEAD(scalbn_zero_neg, tc) 183 1.1 jruoho { 184 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbn(-0.0, n) == -0.0"); 185 1.1 jruoho } 186 1.1 jruoho 187 1.1 jruoho ATF_TC_BODY(scalbn_zero_neg, tc) 188 1.1 jruoho { 189 1.1 jruoho const double x = -0.0L; 190 1.2 jruoho double y; 191 1.1 jruoho size_t i; 192 1.1 jruoho 193 1.2 jruoho ATF_REQUIRE(signbit(x) != 0); 194 1.2 jruoho 195 1.2 jruoho for (i = 0; i < __arraycount(exps); i++) { 196 1.2 jruoho y = scalbn(x, exps[i]); 197 1.2 jruoho ATF_CHECK(x == y); 198 1.2 jruoho ATF_CHECK(signbit(y) != 0); 199 1.2 jruoho } 200 1.1 jruoho } 201 1.1 jruoho 202 1.1 jruoho ATF_TC(scalbn_zero_pos); 203 1.1 jruoho ATF_TC_HEAD(scalbn_zero_pos, tc) 204 1.1 jruoho { 205 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbn(+0.0, n) == +0.0"); 206 1.1 jruoho } 207 1.1 jruoho 208 1.1 jruoho ATF_TC_BODY(scalbn_zero_pos, tc) 209 1.1 jruoho { 210 1.1 jruoho const double x = 0.0L; 211 1.2 jruoho double y; 212 1.1 jruoho size_t i; 213 1.1 jruoho 214 1.2 jruoho ATF_REQUIRE(signbit(x) == 0); 215 1.2 jruoho 216 1.2 jruoho for (i = 0; i < __arraycount(exps); i++) { 217 1.2 jruoho y = scalbn(x, exps[i]); 218 1.2 jruoho ATF_CHECK(x == y); 219 1.2 jruoho ATF_CHECK(signbit(y) == 0); 220 1.2 jruoho } 221 1.1 jruoho } 222 1.1 jruoho 223 1.1 jruoho /* 224 1.1 jruoho * scalbnf(3) 225 1.1 jruoho */ 226 1.8 martin ATF_TC(scalbnf_val); 227 1.8 martin ATF_TC_HEAD(scalbnf_val, tc) 228 1.8 martin { 229 1.8 martin atf_tc_set_md_var(tc, "descr", "Test scalbnf() for a few values"); 230 1.8 martin } 231 1.8 martin 232 1.8 martin ATF_TC_BODY(scalbnf_val, tc) 233 1.8 martin { 234 1.8 martin const struct testcase *tests = test_vals; 235 1.8 martin const size_t tcnt = __arraycount(test_vals); 236 1.8 martin size_t i; 237 1.8 martin double rv; 238 1.8 martin 239 1.8 martin for (i = 0; i < tcnt; i++) { 240 1.13 agc errno = 0; 241 1.8 martin rv = scalbnf(tests[i].inval, tests[i].exp); 242 1.8 martin ATF_CHECK_EQ_MSG(errno, tests[i].error, 243 1.8 martin "test %zu: errno %d instead of %d", i, errno, 244 1.8 martin tests[i].error); 245 1.16 riastrad /* scalbn is always exact except for underflow or overflow. */ 246 1.16 riastrad ATF_CHECK_MSG(rv == (float)tests[i].result, 247 1.16 riastrad "test %zu: return value %.8g instead of %.8g" 248 1.16 riastrad " (error %.8g)", 249 1.16 riastrad i, rv, tests[i].result, 250 1.16 riastrad fabsf((tests[i].result - rv)/tests[i].result)); 251 1.8 martin } 252 1.8 martin } 253 1.8 martin 254 1.1 jruoho ATF_TC(scalbnf_nan); 255 1.1 jruoho ATF_TC_HEAD(scalbnf_nan, tc) 256 1.1 jruoho { 257 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnf(NaN, n) == NaN"); 258 1.1 jruoho } 259 1.1 jruoho 260 1.1 jruoho ATF_TC_BODY(scalbnf_nan, tc) 261 1.1 jruoho { 262 1.1 jruoho const float x = 0.0L / 0.0L; 263 1.1 jruoho float y; 264 1.1 jruoho size_t i; 265 1.1 jruoho 266 1.2 jruoho ATF_REQUIRE(isnan(x) != 0); 267 1.2 jruoho 268 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) { 269 1.1 jruoho y = scalbnf(x, exps[i]); 270 1.1 jruoho ATF_CHECK(isnan(y) != 0); 271 1.1 jruoho } 272 1.1 jruoho } 273 1.1 jruoho 274 1.1 jruoho ATF_TC(scalbnf_inf_neg); 275 1.1 jruoho ATF_TC_HEAD(scalbnf_inf_neg, tc) 276 1.1 jruoho { 277 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnf(-Inf, n) == -Inf"); 278 1.1 jruoho } 279 1.1 jruoho 280 1.1 jruoho ATF_TC_BODY(scalbnf_inf_neg, tc) 281 1.1 jruoho { 282 1.1 jruoho const float x = -1.0L / 0.0L; 283 1.1 jruoho size_t i; 284 1.1 jruoho 285 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) 286 1.1 jruoho ATF_CHECK(scalbnf(x, exps[i]) == x); 287 1.1 jruoho } 288 1.1 jruoho 289 1.1 jruoho ATF_TC(scalbnf_inf_pos); 290 1.1 jruoho ATF_TC_HEAD(scalbnf_inf_pos, tc) 291 1.1 jruoho { 292 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnf(+Inf, n) == +Inf"); 293 1.1 jruoho } 294 1.1 jruoho 295 1.1 jruoho ATF_TC_BODY(scalbnf_inf_pos, tc) 296 1.1 jruoho { 297 1.1 jruoho const float x = 1.0L / 0.0L; 298 1.1 jruoho size_t i; 299 1.1 jruoho 300 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) 301 1.1 jruoho ATF_CHECK(scalbnf(x, exps[i]) == x); 302 1.1 jruoho } 303 1.1 jruoho 304 1.7 jruoho ATF_TC(scalbnf_ldexpf); 305 1.7 jruoho ATF_TC_HEAD(scalbnf_ldexpf, tc) 306 1.6 jruoho { 307 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnf(x, n) == ldexpf(x, n)"); 308 1.6 jruoho } 309 1.6 jruoho 310 1.7 jruoho ATF_TC_BODY(scalbnf_ldexpf, tc) 311 1.6 jruoho { 312 1.6 jruoho #if FLT_RADIX == 2 313 1.6 jruoho const float x = 2.91288191221812821; 314 1.6 jruoho float y; 315 1.6 jruoho size_t i; 316 1.6 jruoho 317 1.6 jruoho for (i = 0; i < __arraycount(exps); i++) { 318 1.6 jruoho y = scalbnf(x, exps[i]); 319 1.8 martin ATF_CHECK_MSG(y == ldexpf(x, exps[i]), 320 1.8 martin "test %zu: exponent=%d, y=%g ldexpf returns %g (diff: %g)", 321 1.8 martin i, exps[i], y, ldexpf(x, exps[i]), y-ldexpf(x, exps[i])); 322 1.6 jruoho } 323 1.6 jruoho #endif 324 1.6 jruoho } 325 1.6 jruoho 326 1.1 jruoho ATF_TC(scalbnf_zero_neg); 327 1.1 jruoho ATF_TC_HEAD(scalbnf_zero_neg, tc) 328 1.1 jruoho { 329 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnf(-0.0, n) == -0.0"); 330 1.1 jruoho } 331 1.1 jruoho 332 1.1 jruoho ATF_TC_BODY(scalbnf_zero_neg, tc) 333 1.1 jruoho { 334 1.1 jruoho const float x = -0.0L; 335 1.2 jruoho float y; 336 1.1 jruoho size_t i; 337 1.1 jruoho 338 1.2 jruoho ATF_REQUIRE(signbit(x) != 0); 339 1.2 jruoho 340 1.2 jruoho for (i = 0; i < __arraycount(exps); i++) { 341 1.2 jruoho y = scalbnf(x, exps[i]); 342 1.2 jruoho ATF_CHECK(x == y); 343 1.2 jruoho ATF_CHECK(signbit(y) != 0); 344 1.2 jruoho } 345 1.1 jruoho } 346 1.1 jruoho 347 1.1 jruoho ATF_TC(scalbnf_zero_pos); 348 1.1 jruoho ATF_TC_HEAD(scalbnf_zero_pos, tc) 349 1.1 jruoho { 350 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnf(+0.0, n) == +0.0"); 351 1.1 jruoho } 352 1.1 jruoho 353 1.1 jruoho ATF_TC_BODY(scalbnf_zero_pos, tc) 354 1.1 jruoho { 355 1.1 jruoho const float x = 0.0L; 356 1.2 jruoho float y; 357 1.1 jruoho size_t i; 358 1.1 jruoho 359 1.2 jruoho ATF_REQUIRE(signbit(x) == 0); 360 1.2 jruoho 361 1.2 jruoho for (i = 0; i < __arraycount(exps); i++) { 362 1.2 jruoho y = scalbnf(x, exps[i]); 363 1.2 jruoho ATF_CHECK(x == y); 364 1.2 jruoho ATF_CHECK(signbit(y) == 0); 365 1.2 jruoho } 366 1.1 jruoho } 367 1.1 jruoho 368 1.1 jruoho /* 369 1.1 jruoho * scalbnl(3) 370 1.1 jruoho */ 371 1.8 martin ATF_TC(scalbnl_val); 372 1.8 martin ATF_TC_HEAD(scalbnl_val, tc) 373 1.8 martin { 374 1.8 martin atf_tc_set_md_var(tc, "descr", "Test scalbnl() for a few values"); 375 1.8 martin } 376 1.8 martin 377 1.8 martin ATF_TC_BODY(scalbnl_val, tc) 378 1.8 martin { 379 1.8 martin const struct testcase *tests = test_vals; 380 1.8 martin const size_t tcnt = __arraycount(test_vals); 381 1.8 martin size_t i; 382 1.8 martin long double rv; 383 1.8 martin 384 1.8 martin for (i = 0; i < tcnt; i++) { 385 1.14 agc errno = 0; 386 1.8 martin rv = scalbnl(tests[i].inval, tests[i].exp); 387 1.8 martin ATF_CHECK_EQ_MSG(errno, tests[i].error, 388 1.8 martin "test %zu: errno %d instead of %d", i, errno, 389 1.8 martin tests[i].error); 390 1.16 riastrad /* scalbn is always exact except for underflow or overflow. */ 391 1.16 riastrad ATF_CHECK_MSG(rv == (long double)tests[i].result, 392 1.16 riastrad "test %zu: return value %.35Lg instead of %.35Lg" 393 1.16 riastrad " (error %.35Lg)", 394 1.16 riastrad i, rv, (long double)tests[i].result, 395 1.16 riastrad fabsl(((long double)tests[i].result - rv)/tests[i].result)); 396 1.8 martin } 397 1.8 martin } 398 1.8 martin 399 1.1 jruoho ATF_TC(scalbnl_nan); 400 1.1 jruoho ATF_TC_HEAD(scalbnl_nan, tc) 401 1.1 jruoho { 402 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnl(NaN, n) == NaN"); 403 1.1 jruoho } 404 1.1 jruoho 405 1.1 jruoho ATF_TC_BODY(scalbnl_nan, tc) 406 1.1 jruoho { 407 1.1 jruoho const long double x = 0.0L / 0.0L; 408 1.1 jruoho long double y; 409 1.1 jruoho size_t i; 410 1.1 jruoho 411 1.18 riastrad ATF_CHECK_MSG(isnan(x), "x=%La", x); 412 1.2 jruoho 413 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) { 414 1.1 jruoho y = scalbnl(x, exps[i]); 415 1.18 riastrad ATF_CHECK_MSG(isnan(y), "y=%La", y); 416 1.1 jruoho } 417 1.1 jruoho } 418 1.1 jruoho 419 1.1 jruoho ATF_TC(scalbnl_inf_neg); 420 1.1 jruoho ATF_TC_HEAD(scalbnl_inf_neg, tc) 421 1.1 jruoho { 422 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnl(-Inf, n) == -Inf"); 423 1.1 jruoho } 424 1.1 jruoho 425 1.1 jruoho ATF_TC_BODY(scalbnl_inf_neg, tc) 426 1.1 jruoho { 427 1.1 jruoho const long double x = -1.0L / 0.0L; 428 1.1 jruoho size_t i; 429 1.1 jruoho 430 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) 431 1.1 jruoho ATF_CHECK(scalbnl(x, exps[i]) == x); 432 1.1 jruoho } 433 1.1 jruoho 434 1.1 jruoho ATF_TC(scalbnl_inf_pos); 435 1.1 jruoho ATF_TC_HEAD(scalbnl_inf_pos, tc) 436 1.1 jruoho { 437 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnl(+Inf, n) == +Inf"); 438 1.1 jruoho } 439 1.1 jruoho 440 1.1 jruoho ATF_TC_BODY(scalbnl_inf_pos, tc) 441 1.1 jruoho { 442 1.1 jruoho const long double x = 1.0L / 0.0L; 443 1.1 jruoho size_t i; 444 1.1 jruoho 445 1.1 jruoho for (i = 0; i < __arraycount(exps); i++) 446 1.1 jruoho ATF_CHECK(scalbnl(x, exps[i]) == x); 447 1.1 jruoho } 448 1.1 jruoho 449 1.1 jruoho ATF_TC(scalbnl_zero_neg); 450 1.1 jruoho ATF_TC_HEAD(scalbnl_zero_neg, tc) 451 1.1 jruoho { 452 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnl(-0.0, n) == -0.0"); 453 1.1 jruoho } 454 1.1 jruoho 455 1.1 jruoho ATF_TC_BODY(scalbnl_zero_neg, tc) 456 1.1 jruoho { 457 1.1 jruoho const long double x = -0.0L; 458 1.2 jruoho long double y; 459 1.1 jruoho size_t i; 460 1.1 jruoho 461 1.2 jruoho ATF_REQUIRE(signbit(x) != 0); 462 1.2 jruoho 463 1.2 jruoho for (i = 0; i < __arraycount(exps); i++) { 464 1.2 jruoho y = scalbnl(x, exps[i]); 465 1.2 jruoho ATF_CHECK(x == y); 466 1.2 jruoho ATF_CHECK(signbit(y) != 0); 467 1.2 jruoho } 468 1.1 jruoho } 469 1.1 jruoho 470 1.1 jruoho ATF_TC(scalbnl_zero_pos); 471 1.1 jruoho ATF_TC_HEAD(scalbnl_zero_pos, tc) 472 1.1 jruoho { 473 1.7 jruoho atf_tc_set_md_var(tc, "descr", "Test scalbnl(+0.0, n) == +0.0"); 474 1.1 jruoho } 475 1.1 jruoho 476 1.1 jruoho ATF_TC_BODY(scalbnl_zero_pos, tc) 477 1.1 jruoho { 478 1.1 jruoho const long double x = 0.0L; 479 1.2 jruoho long double y; 480 1.1 jruoho size_t i; 481 1.1 jruoho 482 1.2 jruoho ATF_REQUIRE(signbit(x) == 0); 483 1.2 jruoho 484 1.2 jruoho for (i = 0; i < __arraycount(exps); i++) { 485 1.2 jruoho y = scalbnl(x, exps[i]); 486 1.2 jruoho ATF_CHECK(x == y); 487 1.2 jruoho ATF_CHECK(signbit(y) == 0); 488 1.2 jruoho } 489 1.1 jruoho } 490 1.1 jruoho 491 1.1 jruoho ATF_TP_ADD_TCS(tp) 492 1.1 jruoho { 493 1.1 jruoho 494 1.8 martin ATF_TP_ADD_TC(tp, scalbn_val); 495 1.1 jruoho ATF_TP_ADD_TC(tp, scalbn_nan); 496 1.1 jruoho ATF_TP_ADD_TC(tp, scalbn_inf_neg); 497 1.1 jruoho ATF_TP_ADD_TC(tp, scalbn_inf_pos); 498 1.6 jruoho ATF_TP_ADD_TC(tp, scalbn_ldexp); 499 1.1 jruoho ATF_TP_ADD_TC(tp, scalbn_zero_neg); 500 1.1 jruoho ATF_TP_ADD_TC(tp, scalbn_zero_pos); 501 1.1 jruoho 502 1.8 martin ATF_TP_ADD_TC(tp, scalbnf_val); 503 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnf_nan); 504 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnf_inf_neg); 505 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnf_inf_pos); 506 1.7 jruoho ATF_TP_ADD_TC(tp, scalbnf_ldexpf); 507 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnf_zero_neg); 508 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnf_zero_pos); 509 1.1 jruoho 510 1.8 martin ATF_TP_ADD_TC(tp, scalbnl_val); 511 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnl_nan); 512 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnl_inf_neg); 513 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnl_inf_pos); 514 1.6 jruoho /* ATF_TP_ADD_TC(tp, scalbnl_ldexp); */ 515 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnl_zero_neg); 516 1.1 jruoho ATF_TP_ADD_TC(tp, scalbnl_zero_pos); 517 1.1 jruoho 518 1.1 jruoho return atf_no_error(); 519 1.1 jruoho } 520