1 /* $OpenBSD: ilogb_test.c,v 1.2 2021/10/22 18:00:22 mbuhl Exp $ */ 2 /*- 3 * Copyright (c) 2004 Stefan Farfeleder 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD: head/lib/msun/tests/ilogb_test.c 292328 2015-12-16 09:11:11Z ngie $ 28 */ 29 30 #include <float.h> 31 #include <limits.h> 32 #include <math.h> 33 #include <stdio.h> 34 #include <stdlib.h> 35 36 #include "test-utils.h" 37 38 ATF_TC_WITHOUT_HEAD(ilogb); 39 ATF_TC_BODY(ilogb, tc) 40 { 41 char buf[128], *end; 42 double d; 43 int e, i; 44 45 ATF_CHECK_EQ(FP_ILOGB0, ilogb(0)); 46 ATF_CHECK_EQ(FP_ILOGBNAN, ilogb(NAN)); 47 ATF_CHECK_EQ(INT_MAX, ilogb(INFINITY)); 48 for (e = DBL_MIN_EXP - DBL_MANT_DIG; e < DBL_MAX_EXP; e++) { 49 snprintf(buf, sizeof(buf), "0x1.p%d", e); 50 d = strtod(buf, &end); 51 ATF_CHECK_EQ('\0', *end); 52 i = ilogb(d); 53 ATF_CHECK_EQ_MSG(e, i, "ilogb(%g) returned %d not %d", d, i, e); 54 } 55 } 56 57 ATF_TC_WITHOUT_HEAD(ilogbf); 58 ATF_TC_BODY(ilogbf, tc) 59 { 60 char buf[128], *end; 61 float f; 62 int e, i; 63 64 ATF_CHECK_EQ(FP_ILOGB0, ilogbf(0)); 65 ATF_CHECK_EQ(FP_ILOGBNAN, ilogbf(NAN)); 66 ATF_CHECK_EQ(INT_MAX, ilogbf(INFINITY)); 67 for (e = FLT_MIN_EXP - FLT_MANT_DIG; e < FLT_MAX_EXP; e++) { 68 snprintf(buf, sizeof(buf), "0x1.p%d", e); 69 f = strtof(buf, &end); 70 ATF_CHECK_EQ('\0', *end); 71 i = ilogbf(f); 72 ATF_CHECK_EQ_MSG(e, i, "ilogbf(%g) returned %d not %d", f, i, 73 e); 74 } 75 } 76 77 ATF_TC_WITHOUT_HEAD(ilogbl); 78 ATF_TC_BODY(ilogbl, tc) 79 { 80 char buf[128], *end; 81 long double ld; 82 int e, i; 83 84 ATF_CHECK_EQ(FP_ILOGB0, ilogbl(0)); 85 ATF_CHECK_EQ(FP_ILOGBNAN, ilogbl(NAN)); 86 ATF_CHECK_EQ(INT_MAX, ilogbl(INFINITY)); 87 for (e = LDBL_MIN_EXP - LDBL_MANT_DIG; e < LDBL_MAX_EXP; e++) { 88 snprintf(buf, sizeof(buf), "0x1.p%d", e); 89 ld = strtold(buf, &end); 90 ATF_CHECK_EQ('\0', *end); 91 i = ilogbl(ld); 92 ATF_CHECK_EQ_MSG(e, i, "ilogbl(%Lg) returned %d not %d", ld, i, 93 e); 94 } 95 } 96 97 ATF_TP_ADD_TCS(tp) 98 { 99 ATF_TP_ADD_TC(tp, ilogb); 100 ATF_TP_ADD_TC(tp, ilogbf); 101 ATF_TP_ADD_TC(tp, ilogbl); 102 103 return (atf_no_error()); 104 } 105