1 1.19 riastrad /* $NetBSD: t_log.c,v 1.19 2024/07/17 14:52:13 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.19 riastrad __RCSID("$NetBSD: t_log.c,v 1.19 2024/07/17 14:52:13 riastradh Exp $"); 33 1.17 riastrad 34 1.17 riastrad #include <sys/types.h> 35 1.1 jruoho 36 1.3 jruoho #include <atf-c.h> 37 1.7 jruoho 38 1.16 riastrad #include <errno.h> 39 1.14 riastrad #include <float.h> 40 1.7 jruoho #include <math.h> 41 1.3 jruoho #include <stdio.h> 42 1.7 jruoho #include <string.h> 43 1.1 jruoho 44 1.16 riastrad #define CHECK_EQ(i, f, x, y) \ 45 1.16 riastrad ATF_CHECK_EQ_MSG(f(x), y, \ 46 1.16 riastrad "[%u] %s(%a=%.17g)=%a=%.17g, expected %a=%.17g", \ 47 1.16 riastrad (i), #f, (double)(x), (double)(x), f(x), f(x), \ 48 1.16 riastrad (double)(y), (double)(y)) 49 1.16 riastrad 50 1.16 riastrad #define CHECKL_EQ(i, f, x, y) \ 51 1.16 riastrad ATF_CHECK_EQ_MSG(f(x), y, \ 52 1.17 riastrad "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected %La=%.34Lg", \ 53 1.16 riastrad (i), #f, (long double)(x), (long double)(x), f(x), f(x), \ 54 1.16 riastrad (long double)(y), (long double)(y)) 55 1.16 riastrad 56 1.16 riastrad #ifdef NAN 57 1.16 riastrad 58 1.16 riastrad #define CHECK_NAN(i, f, x) \ 59 1.16 riastrad ATF_CHECK_MSG(isnan(f(x)), \ 60 1.16 riastrad "[%u] %s(%a=%.17g)=%a=%.17g, expected NaN", \ 61 1.16 riastrad (i), #f, (x), (x), f(x), f(x)) 62 1.16 riastrad 63 1.16 riastrad #define CHECKL_NAN(i, f, x) \ 64 1.16 riastrad ATF_CHECK_MSG(isnan(f(x)), \ 65 1.17 riastrad "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected NaN", \ 66 1.16 riastrad (i), #f, (long double)(x), (long double)(x), f(x), f(x)) 67 1.16 riastrad 68 1.16 riastrad #else /* !defined(NAN) */ 69 1.16 riastrad 70 1.16 riastrad #define CHECK_NAN(i, f, x) do \ 71 1.16 riastrad { \ 72 1.16 riastrad int _checknan_error; \ 73 1.16 riastrad double _checknan_result; \ 74 1.16 riastrad errno = 0; \ 75 1.16 riastrad _checknan_result = f(x); \ 76 1.16 riastrad _checknan_error = errno; \ 77 1.16 riastrad ATF_CHECK_EQ_MSG(errno, EDOM, \ 78 1.16 riastrad "[%u] %s(%a=%.17g)=%a=%.17g errno=%d, expected EDOM=%d", \ 79 1.16 riastrad (i), #f, (double)(x), (double)(x), \ 80 1.16 riastrad _checknan_result, _checknan_result, \ 81 1.16 riastrad _checknan_error, EDOM); \ 82 1.16 riastrad } while (0) 83 1.16 riastrad 84 1.16 riastrad #define CHECKL_NAN(i, f, x) do \ 85 1.16 riastrad { \ 86 1.16 riastrad int _checknan_error; \ 87 1.16 riastrad long double _checknan_result; \ 88 1.16 riastrad errno = 0; \ 89 1.16 riastrad _checknan_result = f(x); \ 90 1.16 riastrad _checknan_error = errno; \ 91 1.16 riastrad ATF_CHECK_EQ_MSG(errno, EDOM, \ 92 1.17 riastrad "[%u] %s(%La=%.34Lg)=%La=%.34Lg errno=%d, expected EDOM=%d", \ 93 1.16 riastrad (i), #f, (long double)(x), (long double)(x), \ 94 1.16 riastrad _checknan_result, _checknan_result, \ 95 1.16 riastrad _checknan_error, EDOM); \ 96 1.16 riastrad } while (0) 97 1.16 riastrad 98 1.16 riastrad #endif /* NAN */ 99 1.16 riastrad 100 1.16 riastrad static const float logf_invalid[] = { 101 1.16 riastrad #ifdef NAN 102 1.16 riastrad NAN, 103 1.16 riastrad #endif 104 1.16 riastrad -HUGE_VALF, 105 1.16 riastrad -FLT_MAX, 106 1.16 riastrad -10, 107 1.16 riastrad -1, 108 1.16 riastrad -FLT_EPSILON, 109 1.16 riastrad -FLT_MIN, 110 1.16 riastrad #ifdef FLT_DENORM_MIN 111 1.16 riastrad -FLT_DENORM_MIN, 112 1.16 riastrad #endif 113 1.16 riastrad }; 114 1.16 riastrad 115 1.16 riastrad static const double log_invalid[] = { 116 1.16 riastrad #ifdef NAN 117 1.16 riastrad NAN, 118 1.16 riastrad #endif 119 1.16 riastrad -HUGE_VAL, 120 1.16 riastrad -DBL_MAX, 121 1.16 riastrad -10, 122 1.16 riastrad -1, 123 1.16 riastrad -DBL_EPSILON, 124 1.16 riastrad -DBL_MIN, 125 1.16 riastrad #ifdef DBL_DENORM_MIN 126 1.16 riastrad -DBL_DENORM_MIN, 127 1.16 riastrad #endif 128 1.16 riastrad }; 129 1.16 riastrad 130 1.16 riastrad static const long double logl_invalid[] = { 131 1.16 riastrad #ifdef NAN 132 1.16 riastrad NAN, 133 1.16 riastrad #endif 134 1.16 riastrad -HUGE_VALL, 135 1.16 riastrad -LDBL_MAX, 136 1.16 riastrad -10, 137 1.16 riastrad -1, 138 1.16 riastrad -LDBL_EPSILON, 139 1.16 riastrad -LDBL_MIN, 140 1.16 riastrad #ifdef LDBL_DENORM_MIN 141 1.16 riastrad -LDBL_DENORM_MIN, 142 1.16 riastrad #endif 143 1.16 riastrad }; 144 1.16 riastrad 145 1.16 riastrad static const float log1pf_invalid[] = { 146 1.16 riastrad #ifdef NAN 147 1.16 riastrad NAN, 148 1.16 riastrad #endif 149 1.16 riastrad -HUGE_VALF, 150 1.16 riastrad -FLT_MAX, 151 1.16 riastrad -10, 152 1.16 riastrad -1 - FLT_EPSILON, 153 1.16 riastrad }; 154 1.16 riastrad 155 1.16 riastrad static const double log1p_invalid[] = { 156 1.16 riastrad #ifdef NAN 157 1.16 riastrad NAN, 158 1.16 riastrad #endif 159 1.16 riastrad -HUGE_VAL, 160 1.16 riastrad -DBL_MAX, 161 1.16 riastrad -10, 162 1.16 riastrad -1 - DBL_EPSILON, 163 1.16 riastrad }; 164 1.16 riastrad 165 1.16 riastrad static const long double log1pl_invalid[] = { 166 1.16 riastrad #ifdef NAN 167 1.16 riastrad NAN, 168 1.16 riastrad #endif 169 1.16 riastrad -HUGE_VALL, 170 1.16 riastrad -LDBL_MAX, 171 1.16 riastrad -10, 172 1.16 riastrad -1 - LDBL_EPSILON, 173 1.16 riastrad }; 174 1.16 riastrad 175 1.3 jruoho /* 176 1.3 jruoho * log10(3) 177 1.3 jruoho */ 178 1.16 riastrad static const struct { 179 1.16 riastrad float x, y; 180 1.16 riastrad } log10f_exact[] = { 181 1.16 riastrad { 1, 0 }, 182 1.16 riastrad { 10, 1 }, 183 1.16 riastrad { 100, 2 }, 184 1.16 riastrad }; 185 1.3 jruoho 186 1.16 riastrad ATF_TC(log10_invalid); 187 1.16 riastrad ATF_TC_HEAD(log10_invalid, tc) 188 1.5 jruoho { 189 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log10/f/l on invalid inputs"); 190 1.5 jruoho } 191 1.16 riastrad ATF_TC_BODY(log10_invalid, tc) 192 1.5 jruoho { 193 1.16 riastrad unsigned i; 194 1.5 jruoho 195 1.16 riastrad for (i = 0; i < __arraycount(logf_invalid); i++) { 196 1.16 riastrad CHECK_NAN(i, log10f, logf_invalid[i]); 197 1.16 riastrad CHECK_NAN(i, log10, logf_invalid[i]); 198 1.16 riastrad CHECKL_NAN(i, log10l, logf_invalid[i]); 199 1.16 riastrad } 200 1.3 jruoho 201 1.16 riastrad for (i = 0; i < __arraycount(log_invalid); i++) { 202 1.16 riastrad CHECK_NAN(i, log10, log_invalid[i]); 203 1.16 riastrad CHECKL_NAN(i, log10l, log_invalid[i]); 204 1.16 riastrad } 205 1.3 jruoho 206 1.16 riastrad for (i = 0; i < __arraycount(logl_invalid); i++) { 207 1.16 riastrad CHECKL_NAN(i, log10l, logl_invalid[i]); 208 1.16 riastrad } 209 1.3 jruoho } 210 1.3 jruoho 211 1.16 riastrad ATF_TC(log10_zero); 212 1.16 riastrad ATF_TC_HEAD(log10_zero, tc) 213 1.3 jruoho { 214 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log10/f/l on zero"); 215 1.3 jruoho } 216 1.16 riastrad ATF_TC_BODY(log10_zero, tc) 217 1.3 jruoho { 218 1.3 jruoho 219 1.16 riastrad CHECK_EQ(0, log10f, +0., -HUGE_VALF); 220 1.16 riastrad CHECK_EQ(0, log10, +0., -HUGE_VAL); 221 1.16 riastrad CHECKL_EQ(0, log10l, +0., -HUGE_VALL); 222 1.3 jruoho 223 1.16 riastrad CHECK_EQ(1, log10f, -0., -HUGE_VALF); 224 1.16 riastrad CHECK_EQ(1, log10, -0., -HUGE_VAL); 225 1.16 riastrad CHECKL_EQ(1, log10l, -0., -HUGE_VALL); 226 1.3 jruoho } 227 1.3 jruoho 228 1.16 riastrad ATF_TC(log10_exact); 229 1.16 riastrad ATF_TC_HEAD(log10_exact, tc) 230 1.3 jruoho { 231 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log10/f/l exact cases"); 232 1.3 jruoho } 233 1.16 riastrad ATF_TC_BODY(log10_exact, tc) 234 1.3 jruoho { 235 1.16 riastrad unsigned i; 236 1.3 jruoho 237 1.16 riastrad ATF_CHECK_EQ(signbit(log10f(1)), 0); 238 1.16 riastrad ATF_CHECK_EQ(signbit(log10(1)), 0); 239 1.16 riastrad ATF_CHECK_EQ(signbit(log10l(1)), 0); 240 1.3 jruoho 241 1.16 riastrad for (i = 0; i < __arraycount(log10f_exact); i++) { 242 1.16 riastrad const float x = log10f_exact[i].x; 243 1.16 riastrad const float y = log10f_exact[i].y; 244 1.3 jruoho 245 1.16 riastrad CHECK_EQ(i, log10f, x, y); 246 1.16 riastrad CHECK_EQ(i, log10, x, y); 247 1.16 riastrad CHECKL_EQ(i, log10l, x, y); 248 1.16 riastrad } 249 1.3 jruoho } 250 1.3 jruoho 251 1.17 riastrad ATF_TC(log10_approx); 252 1.17 riastrad ATF_TC_HEAD(log10_approx, tc) 253 1.17 riastrad { 254 1.17 riastrad atf_tc_set_md_var(tc, "descr", "Test log10/f/l approximate cases"); 255 1.17 riastrad } 256 1.17 riastrad ATF_TC_BODY(log10_approx, tc) 257 1.17 riastrad { 258 1.17 riastrad volatile long double e = 259 1.17 riastrad 2.7182818284590452353602874713526624977572470937L; 260 1.17 riastrad volatile long double e2 = 261 1.17 riastrad 7.3890560989306502272304274605750078131803155705519L; 262 1.17 riastrad volatile long double log10e = 263 1.17 riastrad 0.43429448190325182765112891891660508229439700580367L; 264 1.17 riastrad volatile long double log10e2 = 265 1.17 riastrad 2*0.43429448190325182765112891891660508229439700580367L; 266 1.17 riastrad 267 1.17 riastrad ATF_CHECK_MSG((fabsf((log10f(e) - (float)log10e)/(float)log10e) < 268 1.17 riastrad 2*FLT_EPSILON), 269 1.17 riastrad "log10f(e)=%a=%.8g expected %a=%.8g", 270 1.17 riastrad log10f(e), log10f(e), (float)log10e, (float)log10e); 271 1.17 riastrad ATF_CHECK_MSG((fabs((log10(e) - (double)log10e)/(double)log10e) < 272 1.17 riastrad 2*DBL_EPSILON), 273 1.17 riastrad "log10(e)=%a=%.17g expected %a=%.17g", 274 1.17 riastrad log10(e), log10(e), (double)log10e, (double)log10e); 275 1.17 riastrad ATF_CHECK_MSG((fabsl((log10l(e) - log10e)/log10e) < 2*LDBL_EPSILON), 276 1.17 riastrad "log10l(e)=%La=%.34Lg expected %La=%.34Lg", 277 1.17 riastrad log10l(e), log10l(e), log10e, log10e); 278 1.17 riastrad 279 1.17 riastrad ATF_CHECK_MSG((fabsf((log10f(e2) - (float)log10e2)/(float)log10e2) < 280 1.17 riastrad 2*FLT_EPSILON), 281 1.17 riastrad "log10f(e^2)=%a=%.8g expected %a=%.8g", 282 1.17 riastrad log10f(e2), log10f(e2), (float)log10e2, (float)log10e2); 283 1.17 riastrad ATF_CHECK_MSG((fabs((log10(e2) - (double)log10e2)/(double)log10e2) < 284 1.17 riastrad 2*DBL_EPSILON), 285 1.17 riastrad "log10(e^2)=%a=%.17g expected %a=%.17g", 286 1.17 riastrad log10(e2), log10(e2), (double)log10e2, (double)log10e2); 287 1.17 riastrad ATF_CHECK_MSG((fabsl((log10l(e2) - log10e2)/log10e2) < 2*LDBL_EPSILON), 288 1.17 riastrad "log10l(e^2)=%La=%.34Lg expected %La=%.34Lg", 289 1.17 riastrad log10l(e2), log10l(e2), log10e2, log10e2); 290 1.17 riastrad } 291 1.17 riastrad 292 1.16 riastrad ATF_TC(log10_inf); 293 1.16 riastrad ATF_TC_HEAD(log10_inf, tc) 294 1.3 jruoho { 295 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log10/f/l on +infinity"); 296 1.3 jruoho } 297 1.16 riastrad ATF_TC_BODY(log10_inf, tc) 298 1.3 jruoho { 299 1.3 jruoho 300 1.16 riastrad if (!isinf(INFINITY)) 301 1.16 riastrad atf_tc_skip("no infinities on this architecture"); 302 1.3 jruoho 303 1.16 riastrad CHECK_EQ(0, log10f, INFINITY, INFINITY); 304 1.16 riastrad CHECK_EQ(0, log10, INFINITY, INFINITY); 305 1.16 riastrad CHECKL_EQ(0, log10l, INFINITY, INFINITY); 306 1.3 jruoho } 307 1.3 jruoho 308 1.3 jruoho /* 309 1.3 jruoho * log1p(3) 310 1.3 jruoho */ 311 1.3 jruoho 312 1.16 riastrad ATF_TC(log1p_invalid); 313 1.16 riastrad ATF_TC_HEAD(log1p_invalid, tc) 314 1.3 jruoho { 315 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on invalid inputs"); 316 1.3 jruoho } 317 1.16 riastrad ATF_TC_BODY(log1p_invalid, tc) 318 1.3 jruoho { 319 1.16 riastrad unsigned i; 320 1.3 jruoho 321 1.16 riastrad for (i = 0; i < __arraycount(log1pf_invalid); i++) { 322 1.16 riastrad CHECK_NAN(i, log1pf, log1pf_invalid[i]); 323 1.16 riastrad CHECK_NAN(i, log1p, log1pf_invalid[i]); 324 1.16 riastrad CHECKL_NAN(i, log1pl, log1pf_invalid[i]); 325 1.16 riastrad } 326 1.3 jruoho 327 1.16 riastrad for (i = 0; i < __arraycount(log1p_invalid); i++) { 328 1.16 riastrad CHECK_NAN(i, log1p, log1p_invalid[i]); 329 1.16 riastrad CHECKL_NAN(i, log1pl, log1p_invalid[i]); 330 1.16 riastrad } 331 1.3 jruoho 332 1.16 riastrad for (i = 0; i < __arraycount(log1pl_invalid); i++) { 333 1.16 riastrad CHECKL_NAN(i, log1pl, log1pl_invalid[i]); 334 1.16 riastrad } 335 1.3 jruoho } 336 1.3 jruoho 337 1.16 riastrad ATF_TC(log1p_neg_one); 338 1.16 riastrad ATF_TC_HEAD(log1p_neg_one, tc) 339 1.3 jruoho { 340 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on -1"); 341 1.3 jruoho } 342 1.16 riastrad ATF_TC_BODY(log1p_neg_one, tc) 343 1.3 jruoho { 344 1.3 jruoho 345 1.16 riastrad CHECK_EQ(0, log1pf, -1., -HUGE_VALF); 346 1.16 riastrad CHECK_EQ(0, log1p, -1., -HUGE_VAL); 347 1.16 riastrad CHECKL_EQ(0, log1pl, -1., -HUGE_VALL); 348 1.3 jruoho } 349 1.3 jruoho 350 1.16 riastrad ATF_TC(log1p_exact); 351 1.16 riastrad ATF_TC_HEAD(log1p_exact, tc) 352 1.3 jruoho { 353 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log1p/f/l exact cases"); 354 1.3 jruoho } 355 1.16 riastrad ATF_TC_BODY(log1p_exact, tc) 356 1.3 jruoho { 357 1.3 jruoho 358 1.17 riastrad CHECK_EQ(0, log1pf, -FLT_MIN, -FLT_MIN); 359 1.17 riastrad CHECK_EQ(0, log1p, -DBL_MIN, -DBL_MIN); 360 1.17 riastrad CHECKL_EQ(01, log1pl, -LDBL_MIN, -LDBL_MIN); 361 1.17 riastrad 362 1.17 riastrad CHECK_EQ(1, log1pf, -0., 0); 363 1.17 riastrad CHECK_EQ(1, log1p, -0., 0); 364 1.17 riastrad CHECKL_EQ(1, log1pl, -0., 0); 365 1.17 riastrad 366 1.17 riastrad CHECK_EQ(2, log1pf, +0., 0); 367 1.17 riastrad CHECK_EQ(2, log1p, +0., 0); 368 1.17 riastrad CHECKL_EQ(2, log1pl, +0., 0); 369 1.17 riastrad 370 1.19 riastrad #ifdef __i386__ 371 1.19 riastrad atf_tc_expect_fail("PR port-i386/58434: single-float functions" 372 1.19 riastrad " sometimes return surprisingly much precision"); 373 1.19 riastrad #endif 374 1.17 riastrad CHECK_EQ(3, log1pf, 1, logf(2)); 375 1.19 riastrad #ifdef __i386__ 376 1.19 riastrad atf_tc_expect_pass(); 377 1.19 riastrad #endif 378 1.17 riastrad CHECK_EQ(3, log1p, 1, log(2)); 379 1.17 riastrad CHECKL_EQ(3, log1pl, 1, logl(2)); 380 1.17 riastrad } 381 1.17 riastrad 382 1.17 riastrad ATF_TC(log1p_approx); 383 1.17 riastrad ATF_TC_HEAD(log1p_approx, tc) 384 1.17 riastrad { 385 1.17 riastrad atf_tc_set_md_var(tc, "descr", "Test log1p/f/l approximate cases"); 386 1.17 riastrad } 387 1.17 riastrad ATF_TC_BODY(log1p_approx, tc) 388 1.17 riastrad { 389 1.17 riastrad volatile long double em1 = /* exp(1) - 1 */ 390 1.17 riastrad 1.7182818284590452353602874713526624977572470937L; 391 1.17 riastrad volatile long double e2m1 = /* exp(2) - 1 */ 392 1.17 riastrad 6.3890560989306502272304274605750078131803155705519L; 393 1.17 riastrad 394 1.16 riastrad /* 395 1.17 riastrad * Approximation is close enough that equality of the rounded 396 1.17 riastrad * output had better hold. 397 1.16 riastrad */ 398 1.16 riastrad #ifdef FLT_DENORM_MIN 399 1.16 riastrad CHECK_EQ(0, log1pf, -FLT_DENORM_MIN, -FLT_DENORM_MIN); 400 1.16 riastrad #endif 401 1.16 riastrad #ifdef DBL_DENORM_MIN 402 1.16 riastrad CHECK_EQ(0, log1p, -DBL_DENORM_MIN, -DBL_DENORM_MIN); 403 1.16 riastrad #endif 404 1.16 riastrad #ifdef LDBL_DENORM_MIN 405 1.16 riastrad CHECKL_EQ(0, log1pl, -LDBL_DENORM_MIN, -LDBL_DENORM_MIN); 406 1.16 riastrad #endif 407 1.3 jruoho 408 1.17 riastrad ATF_CHECK_MSG(fabsf((log1pf(em1) - 1)/1) < 2*FLT_EPSILON, 409 1.17 riastrad "log1pf(e)=%a=%.8g", log1pf(em1), log1pf(em1)); 410 1.17 riastrad ATF_CHECK_MSG(fabs((log1p(em1) - 1)/1) < 2*DBL_EPSILON, 411 1.17 riastrad "log1p(e)=%a=%.17g", log1p(em1), log1p(em1)); 412 1.17 riastrad ATF_CHECK_MSG(fabsl((log1pl(em1) - 1)/1) < 2*LDBL_EPSILON, 413 1.17 riastrad "log1pl(e)=%La=%.34Lg", log1pl(em1), log1pl(em1)); 414 1.17 riastrad 415 1.17 riastrad ATF_CHECK_MSG(fabsf((log1pf(e2m1) - 2)/2) < 2*FLT_EPSILON, 416 1.17 riastrad "log1pf(e^2)=%a=%.8g", log1pf(em1), log1pf(em1)); 417 1.17 riastrad ATF_CHECK_MSG(fabs((log1p(e2m1) - 2)/2) < 2*DBL_EPSILON, 418 1.17 riastrad "log1p(e^2)=%a=%.17g", log1p(em1), log1p(em1)); 419 1.17 riastrad ATF_CHECK_MSG(fabsl((log1pl(e2m1) - 2)/2) < 2*LDBL_EPSILON, 420 1.17 riastrad "log1pl(e^2)=%La=%.34Lg", log1pl(em1), log1pl(em1)); 421 1.3 jruoho } 422 1.3 jruoho 423 1.16 riastrad ATF_TC(log1p_inf); 424 1.16 riastrad ATF_TC_HEAD(log1p_inf, tc) 425 1.3 jruoho { 426 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on +infinity"); 427 1.3 jruoho } 428 1.16 riastrad ATF_TC_BODY(log1p_inf, tc) 429 1.3 jruoho { 430 1.3 jruoho 431 1.16 riastrad if (!isinf(INFINITY)) 432 1.16 riastrad atf_tc_skip("no infinities on this architecture"); 433 1.3 jruoho 434 1.16 riastrad CHECK_EQ(0, log1pf, INFINITY, INFINITY); 435 1.16 riastrad CHECK_EQ(0, log1p, INFINITY, INFINITY); 436 1.16 riastrad CHECKL_EQ(0, log1pl, INFINITY, INFINITY); 437 1.3 jruoho } 438 1.3 jruoho 439 1.3 jruoho /* 440 1.3 jruoho * log2(3) 441 1.3 jruoho */ 442 1.16 riastrad static const struct { 443 1.16 riastrad float x, y; 444 1.16 riastrad } log2f_exact[] = { 445 1.16 riastrad #ifdef FLT_DENORM_MIN 446 1.16 riastrad { FLT_DENORM_MIN, FLT_MIN_EXP - FLT_MANT_DIG }, 447 1.16 riastrad #endif 448 1.16 riastrad { FLT_MIN, FLT_MIN_EXP - 1 }, 449 1.16 riastrad { 0.25, -2 }, 450 1.16 riastrad { 0.5, -1 }, 451 1.16 riastrad { 1, 0 }, 452 1.16 riastrad { 2, 1 }, 453 1.16 riastrad { 4, 2 }, 454 1.16 riastrad { 8, 3 }, 455 1.16 riastrad { 1 << FLT_MANT_DIG, FLT_MANT_DIG }, 456 1.16 riastrad { (float)(1 << FLT_MANT_DIG) * (1 << FLT_MANT_DIG), 457 1.16 riastrad 2*FLT_MANT_DIG }, 458 1.16 riastrad }; 459 1.16 riastrad static const struct { 460 1.16 riastrad double x, y; 461 1.16 riastrad } log2_exact[] = { 462 1.16 riastrad #ifdef DBL_DENORM_MIN 463 1.16 riastrad { DBL_DENORM_MIN, DBL_MIN_EXP - DBL_MANT_DIG }, 464 1.16 riastrad #endif 465 1.16 riastrad { DBL_MIN, DBL_MIN_EXP - 1 }, 466 1.16 riastrad { (uint64_t)1 << DBL_MANT_DIG, DBL_MANT_DIG }, 467 1.16 riastrad { ((double)((uint64_t)1 << DBL_MANT_DIG) * 468 1.16 riastrad ((uint64_t)1 << DBL_MANT_DIG)), 469 1.16 riastrad 2*DBL_MANT_DIG }, 470 1.16 riastrad }; 471 1.16 riastrad 472 1.16 riastrad static const struct { 473 1.16 riastrad long double x, y; 474 1.16 riastrad } log2l_exact[] = { 475 1.16 riastrad #ifdef LDBL_DENORM_MIN 476 1.16 riastrad { LDBL_DENORM_MIN, LDBL_MIN_EXP - LDBL_MANT_DIG }, 477 1.16 riastrad #endif 478 1.16 riastrad { LDBL_MIN, LDBL_MIN_EXP - 1 }, 479 1.16 riastrad { ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) * 480 1.16 riastrad ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))), 481 1.16 riastrad LDBL_MANT_DIG }, 482 1.16 riastrad { (((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) * 483 1.16 riastrad ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))) * 484 1.16 riastrad ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) * 485 1.16 riastrad ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2)))), 486 1.16 riastrad 2*LDBL_MANT_DIG }, 487 1.16 riastrad }; 488 1.16 riastrad 489 1.16 riastrad ATF_TC(log2_invalid); 490 1.16 riastrad ATF_TC_HEAD(log2_invalid, tc) 491 1.16 riastrad { 492 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log2/f/l on invalid inputs"); 493 1.16 riastrad } 494 1.16 riastrad ATF_TC_BODY(log2_invalid, tc) 495 1.16 riastrad { 496 1.16 riastrad unsigned i; 497 1.16 riastrad 498 1.16 riastrad for (i = 0; i < __arraycount(logf_invalid); i++) { 499 1.16 riastrad CHECK_NAN(i, log2f, logf_invalid[i]); 500 1.16 riastrad CHECK_NAN(i, log2, logf_invalid[i]); 501 1.16 riastrad CHECKL_NAN(i, log2l, logf_invalid[i]); 502 1.16 riastrad } 503 1.16 riastrad 504 1.16 riastrad for (i = 0; i < __arraycount(log_invalid); i++) { 505 1.16 riastrad CHECK_NAN(i, log2, log_invalid[i]); 506 1.16 riastrad CHECKL_NAN(i, log2l, log_invalid[i]); 507 1.16 riastrad } 508 1.16 riastrad 509 1.16 riastrad for (i = 0; i < __arraycount(logl_invalid); i++) { 510 1.16 riastrad CHECKL_NAN(i, log2l, logl_invalid[i]); 511 1.16 riastrad } 512 1.16 riastrad } 513 1.16 riastrad 514 1.16 riastrad ATF_TC(log2_zero); 515 1.16 riastrad ATF_TC_HEAD(log2_zero, tc) 516 1.16 riastrad { 517 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log2/f/l on zero"); 518 1.16 riastrad } 519 1.16 riastrad ATF_TC_BODY(log2_zero, tc) 520 1.16 riastrad { 521 1.16 riastrad 522 1.16 riastrad CHECK_EQ(0, log2f, +0., -HUGE_VALF); 523 1.16 riastrad CHECK_EQ(0, log2, +0., -HUGE_VAL); 524 1.16 riastrad CHECKL_EQ(0, log2l, +0., -HUGE_VALL); 525 1.16 riastrad 526 1.16 riastrad CHECK_EQ(1, log2f, -0., -HUGE_VALF); 527 1.16 riastrad CHECK_EQ(1, log2, -0., -HUGE_VAL); 528 1.16 riastrad CHECKL_EQ(1, log2l, -0., -HUGE_VALL); 529 1.16 riastrad } 530 1.16 riastrad 531 1.16 riastrad ATF_TC(log2_exact); 532 1.16 riastrad ATF_TC_HEAD(log2_exact, tc) 533 1.16 riastrad { 534 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log2/f/l exact cases"); 535 1.16 riastrad } 536 1.16 riastrad ATF_TC_BODY(log2_exact, tc) 537 1.16 riastrad { 538 1.16 riastrad unsigned i; 539 1.16 riastrad 540 1.16 riastrad ATF_CHECK_EQ(signbit(log2f(1)), 0); 541 1.16 riastrad ATF_CHECK_EQ(signbit(log2(1)), 0); 542 1.16 riastrad ATF_CHECK_EQ(signbit(log2l(1)), 0); 543 1.16 riastrad 544 1.16 riastrad for (i = 0; i < __arraycount(log2f_exact); i++) { 545 1.16 riastrad const float x = log2f_exact[i].x; 546 1.16 riastrad const float y = log2f_exact[i].y; 547 1.16 riastrad 548 1.16 riastrad CHECK_EQ(i, log2f, x, y); 549 1.16 riastrad CHECK_EQ(i, log2, x, y); 550 1.16 riastrad CHECKL_EQ(i, log2l, x, y); 551 1.16 riastrad } 552 1.16 riastrad 553 1.16 riastrad for (i = 0; i < __arraycount(log2_exact); i++) { 554 1.16 riastrad const double x = log2_exact[i].x; 555 1.16 riastrad const double y = log2_exact[i].y; 556 1.16 riastrad 557 1.16 riastrad CHECK_EQ(i, log2, x, y); 558 1.16 riastrad CHECKL_EQ(i, log2l, x, y); 559 1.16 riastrad } 560 1.16 riastrad 561 1.16 riastrad for (i = 0; i < __arraycount(log2l_exact); i++) { 562 1.16 riastrad const long double x = log2l_exact[i].x; 563 1.16 riastrad const long double y = log2l_exact[i].y; 564 1.16 riastrad 565 1.16 riastrad CHECKL_EQ(i, log2l, x, y); 566 1.16 riastrad } 567 1.16 riastrad } 568 1.16 riastrad 569 1.17 riastrad ATF_TC(log2_approx); 570 1.17 riastrad ATF_TC_HEAD(log2_approx, tc) 571 1.17 riastrad { 572 1.17 riastrad atf_tc_set_md_var(tc, "descr", "Test log2/f/l approximate cases"); 573 1.17 riastrad } 574 1.17 riastrad ATF_TC_BODY(log2_approx, tc) 575 1.17 riastrad { 576 1.17 riastrad volatile long double e = 577 1.17 riastrad 2.7182818284590452353602874713526624977572470937L; 578 1.17 riastrad volatile long double e2 = 579 1.17 riastrad 7.3890560989306502272304274605750078131803155705519L; 580 1.17 riastrad volatile long double log2e = 581 1.17 riastrad 1.442695040888963407359924681001892137426645954153L; 582 1.17 riastrad volatile long double log2e2 = 583 1.17 riastrad 2*1.442695040888963407359924681001892137426645954153L; 584 1.17 riastrad 585 1.17 riastrad ATF_CHECK_MSG((fabsf((log2f(e) - (float)log2e)/(float)log2e) < 586 1.17 riastrad 2*FLT_EPSILON), 587 1.17 riastrad "log2f(e)=%a=%.8g expected %a=%.8g", 588 1.17 riastrad log2f(e), log2f(e), (float)log2e, (float)log2e); 589 1.17 riastrad ATF_CHECK_MSG((fabs((log2(e) - (double)log2e)/(double)log2e) < 590 1.17 riastrad 2*DBL_EPSILON), 591 1.17 riastrad "log2(e)=%a=%.17g expected %a=%.17g", 592 1.17 riastrad log2(e), log2(e), (double)log2e, (double)log2e); 593 1.17 riastrad ATF_CHECK_MSG((fabsl((log2l(e) - log2e)/log2e) < 2*LDBL_EPSILON), 594 1.17 riastrad "log2l(e)=%La=%.34Lg expected %La=%.34Lg", 595 1.17 riastrad log2l(e), log2l(e), log2e, log2e); 596 1.17 riastrad 597 1.17 riastrad ATF_CHECK_MSG((fabsf((log2f(e2) - (float)log2e2)/(float)log2e2) < 598 1.17 riastrad 2*FLT_EPSILON), 599 1.17 riastrad "log2f(e^2)=%a=%.8g expected %a=%.8g", 600 1.17 riastrad log2f(e2), log2f(e2), (float)log2e2, (float)log2e2); 601 1.17 riastrad ATF_CHECK_MSG((fabs((log2(e2) - (double)log2e2)/(double)log2e2) < 602 1.17 riastrad 2*DBL_EPSILON), 603 1.17 riastrad "log2(e^2)=%a=%.17g expected %a=%.17g", 604 1.17 riastrad log2(e2), log2(e2), (double)log2e2, (double)log2e2); 605 1.17 riastrad ATF_CHECK_MSG((fabsl((log2l(e2) - log2e2)/log2e2) < 2*LDBL_EPSILON), 606 1.17 riastrad "log2l(e^2)=%La=%.34Lg expected %La=%.34Lg", 607 1.17 riastrad log2l(e2), log2l(e2), log2e2, log2e2); 608 1.17 riastrad } 609 1.17 riastrad 610 1.16 riastrad ATF_TC(log2_inf); 611 1.16 riastrad ATF_TC_HEAD(log2_inf, tc) 612 1.16 riastrad { 613 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log2/f/l on +infinity"); 614 1.16 riastrad } 615 1.16 riastrad ATF_TC_BODY(log2_inf, tc) 616 1.16 riastrad { 617 1.16 riastrad 618 1.16 riastrad if (!isinf(INFINITY)) 619 1.16 riastrad atf_tc_skip("no infinities on this architecture"); 620 1.16 riastrad 621 1.16 riastrad CHECK_EQ(0, log2f, INFINITY, INFINITY); 622 1.16 riastrad CHECK_EQ(0, log2, INFINITY, INFINITY); 623 1.16 riastrad CHECKL_EQ(0, log2l, INFINITY, INFINITY); 624 1.3 jruoho } 625 1.1 jruoho 626 1.3 jruoho /* 627 1.3 jruoho * log(3) 628 1.3 jruoho */ 629 1.1 jruoho 630 1.16 riastrad ATF_TC(log_invalid); 631 1.16 riastrad ATF_TC_HEAD(log_invalid, tc) 632 1.1 jruoho { 633 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log/f/l on invalid inputs"); 634 1.3 jruoho } 635 1.16 riastrad ATF_TC_BODY(log_invalid, tc) 636 1.3 jruoho { 637 1.16 riastrad unsigned i; 638 1.3 jruoho 639 1.16 riastrad for (i = 0; i < __arraycount(logf_invalid); i++) { 640 1.16 riastrad CHECK_NAN(i, logf, logf_invalid[i]); 641 1.16 riastrad CHECK_NAN(i, log, logf_invalid[i]); 642 1.16 riastrad CHECKL_NAN(i, logl, logf_invalid[i]); 643 1.16 riastrad } 644 1.3 jruoho 645 1.16 riastrad for (i = 0; i < __arraycount(log_invalid); i++) { 646 1.16 riastrad CHECK_NAN(i, log, log_invalid[i]); 647 1.16 riastrad CHECKL_NAN(i, logl, log_invalid[i]); 648 1.16 riastrad } 649 1.1 jruoho 650 1.16 riastrad for (i = 0; i < __arraycount(logl_invalid); i++) { 651 1.16 riastrad CHECKL_NAN(i, logl, logl_invalid[i]); 652 1.16 riastrad } 653 1.3 jruoho } 654 1.3 jruoho 655 1.16 riastrad ATF_TC(log_zero); 656 1.16 riastrad ATF_TC_HEAD(log_zero, tc) 657 1.3 jruoho { 658 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log/f/l on zero"); 659 1.3 jruoho } 660 1.16 riastrad ATF_TC_BODY(log_zero, tc) 661 1.3 jruoho { 662 1.1 jruoho 663 1.16 riastrad CHECK_EQ(0, logf, +0., -HUGE_VALF); 664 1.16 riastrad CHECK_EQ(0, log, +0., -HUGE_VAL); 665 1.16 riastrad CHECKL_EQ(0, logl, +0., -HUGE_VALL); 666 1.1 jruoho 667 1.16 riastrad CHECK_EQ(1, logf, -0., -HUGE_VALF); 668 1.16 riastrad CHECK_EQ(1, log, -0., -HUGE_VAL); 669 1.16 riastrad CHECKL_EQ(1, logl, -0., -HUGE_VALL); 670 1.3 jruoho } 671 1.1 jruoho 672 1.17 riastrad ATF_TC(log_exact); 673 1.17 riastrad ATF_TC_HEAD(log_exact, tc) 674 1.3 jruoho { 675 1.17 riastrad atf_tc_set_md_var(tc, "descr", "Test log/f/l exact cases"); 676 1.3 jruoho } 677 1.17 riastrad ATF_TC_BODY(log_exact, tc) 678 1.3 jruoho { 679 1.3 jruoho 680 1.16 riastrad CHECK_EQ(0, logf, 1, 0); 681 1.16 riastrad CHECK_EQ(0, log, 1, 0); 682 1.16 riastrad CHECKL_EQ(0, logl, 1, 0); 683 1.3 jruoho 684 1.16 riastrad ATF_CHECK_EQ(signbit(logf(1)), 0); 685 1.16 riastrad ATF_CHECK_EQ(signbit(log(1)), 0); 686 1.16 riastrad ATF_CHECK_EQ(signbit(logl(1)), 0); 687 1.17 riastrad } 688 1.17 riastrad 689 1.17 riastrad ATF_TC(log_approx); 690 1.17 riastrad ATF_TC_HEAD(log_approx, tc) 691 1.17 riastrad { 692 1.17 riastrad atf_tc_set_md_var(tc, "descr", "Test log/f/l approximate cases"); 693 1.17 riastrad } 694 1.17 riastrad ATF_TC_BODY(log_approx, tc) 695 1.17 riastrad { 696 1.17 riastrad volatile long double e = 697 1.17 riastrad 2.7182818284590452353602874713526624977572470937L; 698 1.17 riastrad volatile long double e2 = 699 1.17 riastrad 7.3890560989306502272304274605750078131803155705519L; 700 1.17 riastrad volatile long double log_2 = 701 1.17 riastrad 0.69314718055994530941723212145817656807550013436025L; 702 1.17 riastrad volatile long double log_10 = 703 1.17 riastrad 2.30258509299404568401799145468436420760110148862875L; 704 1.17 riastrad 705 1.17 riastrad ATF_CHECK_MSG(fabsf((logf(2) - log_2)/log_2) < 2*FLT_EPSILON, 706 1.17 riastrad "logf(2)=%a=%.8g expected %a=%.8g", 707 1.17 riastrad logf(2), logf(2), (float)log_2, (float)log_2); 708 1.17 riastrad ATF_CHECK_MSG(fabs((log(2) - log_2)/log_2) < 2*DBL_EPSILON, 709 1.17 riastrad "log(2)=%a=%.17g expected %a=%.17g", 710 1.17 riastrad log(2), log(2), (double)log_2, (double)log_2); 711 1.17 riastrad ATF_CHECK_MSG(fabsl((logl(2) - log_2)/log_2) < 2*LDBL_EPSILON, 712 1.17 riastrad "logl(2)=%La=%.34Lg expected %La=%.34Lg", 713 1.17 riastrad logl(2), logl(2), log_2, log_2); 714 1.3 jruoho 715 1.17 riastrad ATF_CHECK_MSG(fabsf((logf(e) - 1)/1) < 2*FLT_EPSILON, 716 1.16 riastrad "logf(e)=%a=%.8g", logf(e), logf(e)); 717 1.17 riastrad ATF_CHECK_MSG(fabs((log(e) - 1)/1) < 2*DBL_EPSILON, 718 1.16 riastrad "log(e)=%a=%.17g", log(e), log(e)); 719 1.17 riastrad ATF_CHECK_MSG(fabsl((logl(e) - 1)/1) < 2*LDBL_EPSILON, 720 1.16 riastrad "logl(e)=%La=%.34Lg", logl(e), logl(e)); 721 1.17 riastrad 722 1.17 riastrad ATF_CHECK_MSG(fabsf((logf(e2) - 2)/2) < 2*FLT_EPSILON, 723 1.17 riastrad "logf(e)=%a=%.8g", logf(e2), logf(e2)); 724 1.17 riastrad ATF_CHECK_MSG(fabs((log(e2) - 2)/2) < 2*DBL_EPSILON, 725 1.17 riastrad "log(e)=%a=%.17g", log(e2), log(e2)); 726 1.17 riastrad ATF_CHECK_MSG(fabsl((logl(e2) - 2)/2) < 2*LDBL_EPSILON, 727 1.17 riastrad "logl(e)=%La=%.34Lg", logl(e2), logl(e2)); 728 1.17 riastrad 729 1.17 riastrad ATF_CHECK_MSG(fabsf((logf(10) - log_10)/log_10) < 2*FLT_EPSILON, 730 1.17 riastrad "logf(10)=%a=%.8g expected %a=%.8g", 731 1.17 riastrad logf(10), logf(10), (float)log_10, (float)log_10); 732 1.17 riastrad ATF_CHECK_MSG(fabs((log(10) - log_10)/log_10) < 2*DBL_EPSILON, 733 1.17 riastrad "log(10)=%a=%.17g expected %a=%.17g", 734 1.17 riastrad log(10), log(10), (double)log_10, (double)log_10); 735 1.17 riastrad ATF_CHECK_MSG(fabsl((logl(10) - log_10)/log_10) < 2*LDBL_EPSILON, 736 1.17 riastrad "logl(10)=%La=%.34Lg expected %La=%.34Lg", 737 1.17 riastrad logl(10), logl(10), log_10, log_10); 738 1.5 jruoho } 739 1.5 jruoho 740 1.16 riastrad ATF_TC(log_inf); 741 1.16 riastrad ATF_TC_HEAD(log_inf, tc) 742 1.5 jruoho { 743 1.16 riastrad atf_tc_set_md_var(tc, "descr", "Test log/f/l on +infinity"); 744 1.5 jruoho } 745 1.16 riastrad ATF_TC_BODY(log_inf, tc) 746 1.3 jruoho { 747 1.3 jruoho 748 1.16 riastrad if (!isinf(INFINITY)) 749 1.16 riastrad atf_tc_skip("no infinities on this architecture"); 750 1.3 jruoho 751 1.16 riastrad CHECK_EQ(0, logf, INFINITY, INFINITY); 752 1.16 riastrad CHECK_EQ(0, log, INFINITY, INFINITY); 753 1.16 riastrad CHECKL_EQ(0, logl, INFINITY, INFINITY); 754 1.1 jruoho } 755 1.1 jruoho 756 1.1 jruoho ATF_TP_ADD_TCS(tp) 757 1.1 jruoho { 758 1.1 jruoho 759 1.16 riastrad ATF_TP_ADD_TC(tp, log10_invalid); 760 1.16 riastrad ATF_TP_ADD_TC(tp, log10_zero); 761 1.16 riastrad ATF_TP_ADD_TC(tp, log10_exact); 762 1.17 riastrad ATF_TP_ADD_TC(tp, log10_approx); 763 1.16 riastrad ATF_TP_ADD_TC(tp, log10_inf); 764 1.16 riastrad 765 1.16 riastrad ATF_TP_ADD_TC(tp, log1p_invalid); 766 1.16 riastrad ATF_TP_ADD_TC(tp, log1p_neg_one); 767 1.16 riastrad ATF_TP_ADD_TC(tp, log1p_exact); 768 1.17 riastrad ATF_TP_ADD_TC(tp, log1p_approx); 769 1.16 riastrad ATF_TP_ADD_TC(tp, log1p_inf); 770 1.16 riastrad 771 1.16 riastrad ATF_TP_ADD_TC(tp, log2_invalid); 772 1.16 riastrad ATF_TP_ADD_TC(tp, log2_zero); 773 1.16 riastrad ATF_TP_ADD_TC(tp, log2_exact); 774 1.17 riastrad ATF_TP_ADD_TC(tp, log2_approx); 775 1.16 riastrad ATF_TP_ADD_TC(tp, log2_inf); 776 1.16 riastrad 777 1.16 riastrad ATF_TP_ADD_TC(tp, log_invalid); 778 1.16 riastrad ATF_TP_ADD_TC(tp, log_zero); 779 1.17 riastrad ATF_TP_ADD_TC(tp, log_exact); 780 1.17 riastrad ATF_TP_ADD_TC(tp, log_approx); 781 1.16 riastrad ATF_TP_ADD_TC(tp, log_inf); 782 1.1 jruoho 783 1.1 jruoho return atf_no_error(); 784 1.1 jruoho } 785