14dc607e7SEnji Cooper /*- 24dc607e7SEnji Cooper * Copyright (c) 2004 Stefan Farfeleder 34dc607e7SEnji Cooper * All rights reserved. 44dc607e7SEnji Cooper * 54dc607e7SEnji Cooper * Redistribution and use in source and binary forms, with or without 64dc607e7SEnji Cooper * modification, are permitted provided that the following conditions 74dc607e7SEnji Cooper * are met: 84dc607e7SEnji Cooper * 1. Redistributions of source code must retain the above copyright 94dc607e7SEnji Cooper * notice, this list of conditions and the following disclaimer. 104dc607e7SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 114dc607e7SEnji Cooper * notice, this list of conditions and the following disclaimer in the 124dc607e7SEnji Cooper * documentation and/or other materials provided with the distribution. 134dc607e7SEnji Cooper * 144dc607e7SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 154dc607e7SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 164dc607e7SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 174dc607e7SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 184dc607e7SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 194dc607e7SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 204dc607e7SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 214dc607e7SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 224dc607e7SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 234dc607e7SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 244dc607e7SEnji Cooper * SUCH DAMAGE. 254dc607e7SEnji Cooper * 264dc607e7SEnji Cooper * $FreeBSD$ 274dc607e7SEnji Cooper */ 284dc607e7SEnji Cooper 294dc607e7SEnji Cooper #include <float.h> 304dc607e7SEnji Cooper #include <limits.h> 314dc607e7SEnji Cooper #include <math.h> 324dc607e7SEnji Cooper #include <stdio.h> 334dc607e7SEnji Cooper #include <stdlib.h> 344dc607e7SEnji Cooper 35*133bc645SAlex Richardson #include "test-utils.h" 36*133bc645SAlex Richardson 37*133bc645SAlex Richardson ATF_TC_WITHOUT_HEAD(ilogb); 38*133bc645SAlex Richardson ATF_TC_BODY(ilogb, tc) 394dc607e7SEnji Cooper { 404dc607e7SEnji Cooper char buf[128], *end; 414dc607e7SEnji Cooper double d; 424dc607e7SEnji Cooper int e, i; 434dc607e7SEnji Cooper 44*133bc645SAlex Richardson ATF_CHECK_EQ(FP_ILOGB0, ilogb(0)); 45*133bc645SAlex Richardson ATF_CHECK_EQ(FP_ILOGBNAN, ilogb(NAN)); 46*133bc645SAlex Richardson ATF_CHECK_EQ(INT_MAX, ilogb(INFINITY)); 474dc607e7SEnji Cooper for (e = DBL_MIN_EXP - DBL_MANT_DIG; e < DBL_MAX_EXP; e++) { 484dc607e7SEnji Cooper snprintf(buf, sizeof(buf), "0x1.p%d", e); 494dc607e7SEnji Cooper d = strtod(buf, &end); 50*133bc645SAlex Richardson ATF_CHECK_EQ('\0', *end); 514dc607e7SEnji Cooper i = ilogb(d); 52*133bc645SAlex Richardson ATF_CHECK_EQ_MSG(e, i, "ilogb(%g) returned %d not %d", d, i, e); 534dc607e7SEnji Cooper } 54*133bc645SAlex Richardson } 554dc607e7SEnji Cooper 56*133bc645SAlex Richardson ATF_TC_WITHOUT_HEAD(ilogbf); 57*133bc645SAlex Richardson ATF_TC_BODY(ilogbf, tc) 58*133bc645SAlex Richardson { 59*133bc645SAlex Richardson char buf[128], *end; 60*133bc645SAlex Richardson float f; 61*133bc645SAlex Richardson int e, i; 62*133bc645SAlex Richardson 63*133bc645SAlex Richardson ATF_CHECK_EQ(FP_ILOGB0, ilogbf(0)); 64*133bc645SAlex Richardson ATF_CHECK_EQ(FP_ILOGBNAN, ilogbf(NAN)); 65*133bc645SAlex Richardson ATF_CHECK_EQ(INT_MAX, ilogbf(INFINITY)); 664dc607e7SEnji Cooper for (e = FLT_MIN_EXP - FLT_MANT_DIG; e < FLT_MAX_EXP; e++) { 674dc607e7SEnji Cooper snprintf(buf, sizeof(buf), "0x1.p%d", e); 684dc607e7SEnji Cooper f = strtof(buf, &end); 69*133bc645SAlex Richardson ATF_CHECK_EQ('\0', *end); 704dc607e7SEnji Cooper i = ilogbf(f); 71*133bc645SAlex Richardson ATF_CHECK_EQ_MSG(e, i, "ilogbf(%g) returned %d not %d", f, i, 72*133bc645SAlex Richardson e); 734dc607e7SEnji Cooper } 74*133bc645SAlex Richardson } 754dc607e7SEnji Cooper 76*133bc645SAlex Richardson ATF_TC_WITHOUT_HEAD(ilogbl); 77*133bc645SAlex Richardson ATF_TC_BODY(ilogbl, tc) 78*133bc645SAlex Richardson { 79*133bc645SAlex Richardson char buf[128], *end; 80*133bc645SAlex Richardson long double ld; 81*133bc645SAlex Richardson int e, i; 82*133bc645SAlex Richardson 83*133bc645SAlex Richardson ATF_CHECK_EQ(FP_ILOGB0, ilogbl(0)); 84*133bc645SAlex Richardson ATF_CHECK_EQ(FP_ILOGBNAN, ilogbl(NAN)); 85*133bc645SAlex Richardson ATF_CHECK_EQ(INT_MAX, ilogbl(INFINITY)); 864dc607e7SEnji Cooper for (e = LDBL_MIN_EXP - LDBL_MANT_DIG; e < LDBL_MAX_EXP; e++) { 874dc607e7SEnji Cooper snprintf(buf, sizeof(buf), "0x1.p%d", e); 884dc607e7SEnji Cooper ld = strtold(buf, &end); 89*133bc645SAlex Richardson ATF_CHECK_EQ('\0', *end); 904dc607e7SEnji Cooper i = ilogbl(ld); 91*133bc645SAlex Richardson ATF_CHECK_EQ_MSG(e, i, "ilogbl(%Lg) returned %d not %d", ld, i, 92*133bc645SAlex Richardson e); 934dc607e7SEnji Cooper } 94*133bc645SAlex Richardson } 954dc607e7SEnji Cooper 96*133bc645SAlex Richardson ATF_TP_ADD_TCS(tp) 97*133bc645SAlex Richardson { 98*133bc645SAlex Richardson ATF_TP_ADD_TC(tp, ilogb); 99*133bc645SAlex Richardson ATF_TP_ADD_TC(tp, ilogbf); 100*133bc645SAlex Richardson ATF_TP_ADD_TC(tp, ilogbl); 101*133bc645SAlex Richardson 102*133bc645SAlex Richardson return (atf_no_error()); 1034dc607e7SEnji Cooper } 104