1 1.6 riastrad /* $NetBSD: t_modf.c,v 1.6 2024/05/15 00:02:57 riastradh Exp $ */ 2 1.1 joerg 3 1.1 joerg /*- 4 1.1 joerg * Copyright (c) 2014 The NetBSD Foundation, Inc. 5 1.1 joerg * All rights reserved. 6 1.1 joerg * 7 1.1 joerg * This code is derived from software contributed to The NetBSD Foundation 8 1.1 joerg * by Joerg Sonnenberger. 9 1.1 joerg * 10 1.1 joerg * Redistribution and use in source and binary forms, with or without 11 1.1 joerg * modification, are permitted provided that the following conditions 12 1.1 joerg * are met: 13 1.1 joerg * 1. Redistributions of source code must retain the above copyright 14 1.1 joerg * notice, this list of conditions and the following disclaimer. 15 1.1 joerg * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 joerg * notice, this list of conditions and the following disclaimer in the 17 1.1 joerg * documentation and/or other materials provided with the distribution. 18 1.1 joerg * 19 1.1 joerg * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 joerg * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 joerg * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 joerg * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 joerg * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 joerg * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 joerg * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 joerg * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 joerg * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 joerg * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 joerg * POSSIBILITY OF SUCH DAMAGE. 30 1.1 joerg */ 31 1.1 joerg 32 1.2 riastrad #include <sys/cdefs.h> 33 1.6 riastrad __RCSID("$NetBSD: t_modf.c,v 1.6 2024/05/15 00:02:57 riastradh Exp $"); 34 1.2 riastrad 35 1.1 joerg #include <atf-c.h> 36 1.1 joerg #include <float.h> 37 1.1 joerg #include <math.h> 38 1.1 joerg 39 1.2 riastrad __CTASSERT(FLT_RADIX == 2); 40 1.2 riastrad 41 1.2 riastrad static const struct { 42 1.2 riastrad float x, i, f; 43 1.2 riastrad } casesf[] = { 44 1.2 riastrad { 0, 0, 0 }, 45 1.2 riastrad { FLT_MIN, 0, FLT_MIN }, 46 1.2 riastrad { 0.5, 0, 0.5 }, 47 1.2 riastrad { 1 - FLT_EPSILON/2, 0, 1 - FLT_EPSILON/2 }, 48 1.2 riastrad { 1, 1, 0 }, 49 1.2 riastrad { 1 + FLT_EPSILON, 1, FLT_EPSILON }, 50 1.2 riastrad { 0.5/FLT_EPSILON - 0.5, 0.5/FLT_EPSILON - 1, 0.5 }, 51 1.2 riastrad { 0.5/FLT_EPSILON, 0.5/FLT_EPSILON, 0 }, 52 1.2 riastrad { 0.5/FLT_EPSILON + 0.5, 0.5/FLT_EPSILON, 0.5 }, 53 1.2 riastrad { 1/FLT_EPSILON, 1/FLT_EPSILON, 0 }, 54 1.2 riastrad }; 55 1.2 riastrad 56 1.2 riastrad static const struct { 57 1.2 riastrad double x, i, f; 58 1.2 riastrad } cases[] = { 59 1.2 riastrad { 0, 0, 0 }, 60 1.2 riastrad { DBL_MIN, 0, DBL_MIN }, 61 1.2 riastrad { 0.5, 0, 0.5 }, 62 1.2 riastrad { 1 - DBL_EPSILON/2, 0, 1 - DBL_EPSILON/2 }, 63 1.2 riastrad { 1, 1, 0 }, 64 1.2 riastrad { 1 + DBL_EPSILON, 1, DBL_EPSILON }, 65 1.2 riastrad { 1/FLT_EPSILON + 0.5, 1/FLT_EPSILON, 0.5 }, 66 1.2 riastrad { 0.5/DBL_EPSILON - 0.5, 0.5/DBL_EPSILON - 1, 0.5 }, 67 1.2 riastrad { 0.5/DBL_EPSILON, 0.5/DBL_EPSILON, 0 }, 68 1.2 riastrad { 0.5/DBL_EPSILON + 0.5, 0.5/DBL_EPSILON, 0.5 }, 69 1.2 riastrad { 1/DBL_EPSILON, 1/DBL_EPSILON, 0 }, 70 1.2 riastrad }; 71 1.2 riastrad 72 1.2 riastrad #ifdef __HAVE_LONG_DOUBLE 73 1.2 riastrad static const struct { 74 1.2 riastrad long double x, i, f; 75 1.2 riastrad } casesl[] = { 76 1.2 riastrad { 0, 0, 0 }, 77 1.2 riastrad { LDBL_MIN, 0, LDBL_MIN }, 78 1.2 riastrad { 0.5, 0, 0.5 }, 79 1.2 riastrad { 1 - LDBL_EPSILON/2, 0, 1 - LDBL_EPSILON/2 }, 80 1.2 riastrad { 1, 1, 0 }, 81 1.2 riastrad { 1 + LDBL_EPSILON, 1, LDBL_EPSILON }, 82 1.2 riastrad { 1.0L/DBL_EPSILON + 0.5L, 1.0L/DBL_EPSILON, 0.5 }, 83 1.2 riastrad { 0.5/LDBL_EPSILON - 0.5L, 0.5/LDBL_EPSILON - 1, 0.5 }, 84 1.2 riastrad { 0.5/LDBL_EPSILON, 0.5/LDBL_EPSILON, 0 }, 85 1.2 riastrad { 0.5/LDBL_EPSILON + 0.5L, 0.5/LDBL_EPSILON, 0.5 }, 86 1.2 riastrad { 1/LDBL_EPSILON, 1/LDBL_EPSILON, 0 }, 87 1.2 riastrad }; 88 1.2 riastrad #endif /* __HAVE_LONG_DOUBLE */ 89 1.2 riastrad 90 1.2 riastrad ATF_TC(modff); 91 1.2 riastrad ATF_TC_HEAD(modff, tc) 92 1.2 riastrad { 93 1.2 riastrad atf_tc_set_md_var(tc, "descr", "modff(3)"); 94 1.2 riastrad } 95 1.2 riastrad ATF_TC_BODY(modff, tc) 96 1.2 riastrad { 97 1.2 riastrad unsigned n; 98 1.2 riastrad 99 1.2 riastrad for (n = 0; n < __arraycount(casesf); n++) { 100 1.2 riastrad float x, i, f; 101 1.2 riastrad 102 1.2 riastrad x = casesf[n].x; 103 1.2 riastrad f = modff(x, &i); 104 1.2 riastrad ATF_CHECK_EQ_MSG(i, casesf[n].i, 105 1.2 riastrad "casesf[%u]: modff %g=%a" 106 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 107 1.2 riastrad " expected integer %g=%a, frac %g=%a", 108 1.2 riastrad n, x, x, i, i, f, f, 109 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 110 1.2 riastrad ATF_CHECK_EQ_MSG(f, casesf[n].f, 111 1.2 riastrad "casesf[%u]: modff %g=%a" 112 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 113 1.2 riastrad " expected integer %g=%a, frac %g=%a", 114 1.2 riastrad n, x, x, i, i, f, f, 115 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 116 1.2 riastrad 117 1.2 riastrad f = modff(-x, &i); 118 1.2 riastrad ATF_CHECK_EQ_MSG(i, -casesf[n].i, 119 1.2 riastrad "casesf[%u]: modff %g=%a" 120 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 121 1.2 riastrad " expected integer %g=%a, frac %g=%a", 122 1.2 riastrad n, x, x, i, i, f, f, 123 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 124 1.2 riastrad ATF_CHECK_EQ_MSG(f, -casesf[n].f, 125 1.2 riastrad "casesf[%u]: modff %g=%a" 126 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 127 1.2 riastrad " expected integer %g=%a, frac %g=%a", 128 1.2 riastrad n, x, x, i, i, f, f, 129 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 130 1.2 riastrad } 131 1.2 riastrad 132 1.4 riastrad if (isinf(INFINITY)) { 133 1.2 riastrad float x, i, f; 134 1.2 riastrad 135 1.2 riastrad x = INFINITY; 136 1.2 riastrad f = modff(x, &i); 137 1.2 riastrad ATF_CHECK_MSG(f == 0, 138 1.2 riastrad "modff +inf returned integer %g=%a, frac %g=%a", 139 1.2 riastrad i, i, f, f); 140 1.3 riastrad ATF_CHECK_MSG(isinf(i) && i > 0, 141 1.2 riastrad "modff +inf returned integer %g=%a, frac %g=%a", 142 1.2 riastrad i, i, f, f); 143 1.2 riastrad 144 1.2 riastrad x = -INFINITY; 145 1.2 riastrad f = modff(x, &i); 146 1.2 riastrad ATF_CHECK_MSG(f == 0, 147 1.2 riastrad "modff -inf returned integer %g=%a, frac %g=%a", 148 1.2 riastrad i, i, f, f); 149 1.3 riastrad ATF_CHECK_MSG(isinf(i) && i < 0, 150 1.2 riastrad "modff -inf returned integer %g=%a, frac %g=%a", 151 1.2 riastrad i, i, f, f); 152 1.2 riastrad } 153 1.2 riastrad 154 1.2 riastrad #ifdef NAN 155 1.2 riastrad { 156 1.2 riastrad float x, i, f; 157 1.2 riastrad 158 1.2 riastrad x = NAN; 159 1.2 riastrad f = modff(x, &i); 160 1.2 riastrad ATF_CHECK_MSG(isnan(f), 161 1.2 riastrad "modff NaN returned integer %g=%a, frac %g=%a", 162 1.2 riastrad i, i, f, f); 163 1.2 riastrad ATF_CHECK_MSG(isnan(i), 164 1.2 riastrad "modff NaN returned integer %g=%a, frac %g=%a", 165 1.2 riastrad i, i, f, f); 166 1.2 riastrad } 167 1.2 riastrad #endif /* NAN */ 168 1.2 riastrad } 169 1.2 riastrad 170 1.1 joerg ATF_TC(modf); 171 1.1 joerg ATF_TC_HEAD(modf, tc) 172 1.1 joerg { 173 1.2 riastrad atf_tc_set_md_var(tc, "descr", "modf(3)"); 174 1.1 joerg } 175 1.2 riastrad ATF_TC_BODY(modf, tc) 176 1.2 riastrad { 177 1.2 riastrad unsigned n; 178 1.2 riastrad 179 1.2 riastrad for (n = 0; n < __arraycount(casesf); n++) { 180 1.2 riastrad double x, i, f; 181 1.2 riastrad 182 1.2 riastrad x = casesf[n].x; 183 1.2 riastrad f = modf(x, &i); 184 1.2 riastrad ATF_CHECK_EQ_MSG(i, casesf[n].i, 185 1.2 riastrad "casesf[%u]: modf %g=%a" 186 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 187 1.2 riastrad " expected integer %g=%a, frac %g=%a", 188 1.2 riastrad n, x, x, i, i, f, f, 189 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 190 1.2 riastrad ATF_CHECK_EQ_MSG(f, casesf[n].f, 191 1.2 riastrad "casesf[%u]: modf %g=%a" 192 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 193 1.2 riastrad " expected integer %g=%a, frac %g=%a", 194 1.2 riastrad n, x, x, i, i, f, f, 195 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 196 1.2 riastrad 197 1.2 riastrad f = modf(-x, &i); 198 1.2 riastrad ATF_CHECK_EQ_MSG(i, -casesf[n].i, 199 1.2 riastrad "casesf[%u]: modf %g=%a" 200 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 201 1.2 riastrad " expected integer %g=%a, frac %g=%a", 202 1.2 riastrad n, x, x, i, i, f, f, 203 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 204 1.2 riastrad ATF_CHECK_EQ_MSG(f, -casesf[n].f, 205 1.2 riastrad "casesf[%u]: modf %g=%a" 206 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 207 1.2 riastrad " expected integer %g=%a, frac %g=%a", 208 1.2 riastrad n, x, x, i, i, f, f, 209 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 210 1.2 riastrad } 211 1.2 riastrad 212 1.2 riastrad for (n = 0; n < __arraycount(cases); n++) { 213 1.2 riastrad double x, i, f; 214 1.2 riastrad 215 1.2 riastrad x = cases[n].x; 216 1.2 riastrad f = modf(x, &i); 217 1.2 riastrad ATF_CHECK_EQ_MSG(i, cases[n].i, 218 1.2 riastrad "cases[%u]: modf %g=%a" 219 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 220 1.2 riastrad " expected integer %g=%a, frac %g=%a", 221 1.2 riastrad n, x, x, i, i, f, f, 222 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 223 1.2 riastrad ATF_CHECK_EQ_MSG(f, cases[n].f, 224 1.2 riastrad "cases[%u]: modf %g=%a" 225 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 226 1.2 riastrad " expected integer %g=%a, frac %g=%a", 227 1.2 riastrad n, x, x, i, i, f, f, 228 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 229 1.1 joerg 230 1.2 riastrad f = modf(-x, &i); 231 1.2 riastrad ATF_CHECK_EQ_MSG(i, -cases[n].i, 232 1.2 riastrad "cases[%u]: modf %g=%a" 233 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 234 1.2 riastrad " expected integer %g=%a, frac %g=%a", 235 1.2 riastrad n, x, x, i, i, f, f, 236 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 237 1.2 riastrad ATF_CHECK_EQ_MSG(f, -cases[n].f, 238 1.2 riastrad "cases[%u]: modf %g=%a" 239 1.2 riastrad " returned integer %g=%a, frac %g=%a;" 240 1.2 riastrad " expected integer %g=%a, frac %g=%a", 241 1.2 riastrad n, x, x, i, i, f, f, 242 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 243 1.2 riastrad } 244 1.2 riastrad 245 1.4 riastrad if (isinf(INFINITY)) { 246 1.2 riastrad double x, i, f; 247 1.2 riastrad 248 1.2 riastrad x = INFINITY; 249 1.2 riastrad f = modf(x, &i); 250 1.2 riastrad ATF_CHECK_MSG(f == 0, 251 1.2 riastrad "modf +inf returned integer %g=%a, frac %g=%a", 252 1.2 riastrad i, i, f, f); 253 1.3 riastrad ATF_CHECK_MSG(isinf(i) && i > 0, 254 1.2 riastrad "modf +inf returned integer %g=%a, frac %g=%a", 255 1.2 riastrad i, i, f, f); 256 1.2 riastrad 257 1.2 riastrad x = -INFINITY; 258 1.2 riastrad f = modf(x, &i); 259 1.2 riastrad ATF_CHECK_MSG(f == 0, 260 1.2 riastrad "modf -inf returned integer %g=%a, frac %g=%a", 261 1.2 riastrad i, i, f, f); 262 1.3 riastrad ATF_CHECK_MSG(isinf(i) && i < 0, 263 1.2 riastrad "modf -inf returned integer %g=%a, frac %g=%a", 264 1.2 riastrad i, i, f, f); 265 1.2 riastrad } 266 1.2 riastrad 267 1.2 riastrad #ifdef NAN 268 1.2 riastrad { 269 1.2 riastrad double x, i, f; 270 1.2 riastrad 271 1.2 riastrad x = NAN; 272 1.2 riastrad f = modf(x, &i); 273 1.2 riastrad ATF_CHECK_MSG(isnan(f), 274 1.2 riastrad "modf NaN returned integer %g=%a, frac %g=%a", 275 1.2 riastrad i, i, f, f); 276 1.2 riastrad ATF_CHECK_MSG(isnan(i), 277 1.2 riastrad "modf NaN returned integer %g=%a, frac %g=%a", 278 1.2 riastrad i, i, f, f); 279 1.2 riastrad } 280 1.2 riastrad #endif /* NAN */ 281 1.2 riastrad } 282 1.2 riastrad 283 1.2 riastrad ATF_TC(modfl); 284 1.2 riastrad ATF_TC_HEAD(modfl, tc) 285 1.2 riastrad { 286 1.2 riastrad atf_tc_set_md_var(tc, "descr", "modfl(3)"); 287 1.2 riastrad } 288 1.2 riastrad ATF_TC_BODY(modfl, tc) 289 1.1 joerg { 290 1.2 riastrad unsigned n; 291 1.2 riastrad 292 1.2 riastrad for (n = 0; n < __arraycount(casesf); n++) { 293 1.2 riastrad long double x, i, f; 294 1.2 riastrad 295 1.2 riastrad x = casesf[n].x; 296 1.2 riastrad f = modfl(x, &i); 297 1.2 riastrad ATF_CHECK_EQ_MSG(i, casesf[n].i, 298 1.2 riastrad "casesf[%u]: modfl %Lg=%La" 299 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 300 1.2 riastrad " expected integer %g=%a, frac %g=%a", 301 1.2 riastrad n, x, x, i, i, f, f, 302 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 303 1.2 riastrad ATF_CHECK_EQ_MSG(f, casesf[n].f, 304 1.2 riastrad "casesf[%u]: modfl %Lg=%La" 305 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 306 1.2 riastrad " expected integer %g=%a, frac %g=%a", 307 1.2 riastrad n, x, x, i, i, f, f, 308 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 309 1.2 riastrad 310 1.2 riastrad f = modfl(-x, &i); 311 1.2 riastrad ATF_CHECK_EQ_MSG(i, -casesf[n].i, 312 1.2 riastrad "casesf[%u]: modfl %Lg=%La" 313 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 314 1.2 riastrad " expected integer %g=%a, frac %g=%a", 315 1.2 riastrad n, x, x, i, i, f, f, 316 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 317 1.2 riastrad ATF_CHECK_EQ_MSG(f, -casesf[n].f, 318 1.2 riastrad "casesf[%u]: modfl %Lg=%La" 319 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 320 1.2 riastrad " expected integer %g=%a, frac %g=%a", 321 1.2 riastrad n, x, x, i, i, f, f, 322 1.2 riastrad casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f); 323 1.2 riastrad } 324 1.2 riastrad 325 1.2 riastrad for (n = 0; n < __arraycount(cases); n++) { 326 1.2 riastrad long double x, i, f; 327 1.2 riastrad 328 1.2 riastrad x = cases[n].x; 329 1.2 riastrad f = modfl(x, &i); 330 1.2 riastrad ATF_CHECK_EQ_MSG(i, cases[n].i, 331 1.2 riastrad "cases[%u]: modfl %Lg=%La" 332 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 333 1.2 riastrad " expected integer %g=%a, frac %g=%a", 334 1.2 riastrad n, x, x, i, i, f, f, 335 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 336 1.2 riastrad ATF_CHECK_EQ_MSG(f, cases[n].f, 337 1.2 riastrad "cases[%u]: modfl %Lg=%La" 338 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 339 1.2 riastrad " expected integer %g=%a, frac %g=%a", 340 1.2 riastrad n, x, x, i, i, f, f, 341 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 342 1.2 riastrad 343 1.2 riastrad f = modfl(-x, &i); 344 1.2 riastrad ATF_CHECK_EQ_MSG(i, -cases[n].i, 345 1.2 riastrad "cases[%u]: modfl %Lg=%La" 346 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 347 1.2 riastrad " expected integer %g=%a, frac %g=%a", 348 1.2 riastrad n, x, x, i, i, f, f, 349 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 350 1.2 riastrad ATF_CHECK_EQ_MSG(f, -cases[n].f, 351 1.2 riastrad "cases[%u]: modfl %Lg=%La" 352 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 353 1.2 riastrad " expected integer %g=%a, frac %g=%a", 354 1.2 riastrad n, x, x, i, i, f, f, 355 1.2 riastrad cases[n].i, cases[n].i, cases[n].f, cases[n].f); 356 1.2 riastrad } 357 1.2 riastrad 358 1.2 riastrad #ifdef __HAVE_LONG_DOUBLE 359 1.2 riastrad for (n = 0; n < __arraycount(casesl); n++) { 360 1.2 riastrad long double x, i, f; 361 1.2 riastrad 362 1.2 riastrad x = casesl[n].x; 363 1.2 riastrad f = modfl(x, &i); 364 1.2 riastrad ATF_CHECK_EQ_MSG(i, casesl[n].i, 365 1.2 riastrad "casesl[%u]: modfl %Lg=%La" 366 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 367 1.2 riastrad " expected integer %Lg=%La, frac %Lg=%La", 368 1.2 riastrad n, x, x, i, i, f, f, 369 1.2 riastrad casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f); 370 1.2 riastrad ATF_CHECK_EQ_MSG(f, casesl[n].f, 371 1.2 riastrad "casesl[%u]: modfl %Lg=%La" 372 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 373 1.2 riastrad " expected integer %Lg=%La, frac %Lg=%La", 374 1.2 riastrad n, x, x, i, i, f, f, 375 1.2 riastrad casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f); 376 1.2 riastrad 377 1.2 riastrad f = modfl(-x, &i); 378 1.2 riastrad ATF_CHECK_EQ_MSG(i, -casesl[n].i, 379 1.2 riastrad "casesl[%u]: modfl %Lg=%La" 380 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 381 1.2 riastrad " expected integer %Lg=%La, frac %Lg=%La", 382 1.2 riastrad n, x, x, i, i, f, f, 383 1.2 riastrad casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f); 384 1.2 riastrad ATF_CHECK_EQ_MSG(f, -casesl[n].f, 385 1.2 riastrad "casesl[%u]: modfl %Lg=%La" 386 1.2 riastrad " returned integer %Lg=%La, frac %Lg=%La;" 387 1.2 riastrad " expected integer %Lg=%La, frac %Lg=%La", 388 1.2 riastrad n, x, x, i, i, f, f, 389 1.2 riastrad casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f); 390 1.2 riastrad } 391 1.2 riastrad #endif /* __HAVE_LONG_DOUBLE */ 392 1.2 riastrad 393 1.4 riastrad if (isinf(INFINITY)) { 394 1.2 riastrad long double x, i, f; 395 1.2 riastrad 396 1.2 riastrad x = INFINITY; 397 1.2 riastrad f = modfl(x, &i); 398 1.2 riastrad ATF_CHECK_MSG(f == 0, 399 1.2 riastrad "modfl +inf returned integer %Lg=%La, frac %Lg=%La", 400 1.2 riastrad i, i, f, f); 401 1.3 riastrad ATF_CHECK_MSG(isinf(i) && i > 0, 402 1.2 riastrad "modfl +inf returned integer %Lg=%La, frac %Lg=%La", 403 1.2 riastrad i, i, f, f); 404 1.2 riastrad 405 1.2 riastrad x = -INFINITY; 406 1.2 riastrad f = modfl(x, &i); 407 1.2 riastrad ATF_CHECK_MSG(f == 0, 408 1.2 riastrad "modfl -inf returned integer %Lg=%La, frac %Lg=%La", 409 1.2 riastrad i, i, f, f); 410 1.3 riastrad ATF_CHECK_MSG(isinf(i) && i < 0, 411 1.2 riastrad "modfl -inf returned integer %Lg=%La, frac %Lg=%La", 412 1.2 riastrad i, i, f, f); 413 1.2 riastrad } 414 1.2 riastrad 415 1.2 riastrad #ifdef NAN 416 1.2 riastrad { 417 1.2 riastrad long double x, i, f; 418 1.2 riastrad 419 1.2 riastrad x = NAN; 420 1.2 riastrad f = modfl(x, &i); 421 1.2 riastrad ATF_CHECK_MSG(isnan(f), 422 1.2 riastrad "modfl NaN returned integer %Lg=%La, frac %Lg=%La", 423 1.2 riastrad i, i, f, f); 424 1.2 riastrad ATF_CHECK_MSG(isnan(i), 425 1.2 riastrad "modfl NaN returned integer %Lg=%La, frac %Lg=%La", 426 1.2 riastrad i, i, f, f); 427 1.2 riastrad } 428 1.4 riastrad #endif /* NAN */ 429 1.1 joerg } 430 1.1 joerg 431 1.1 joerg ATF_TP_ADD_TCS(tp) 432 1.1 joerg { 433 1.1 joerg 434 1.2 riastrad ATF_TP_ADD_TC(tp, modff); 435 1.1 joerg ATF_TP_ADD_TC(tp, modf); 436 1.2 riastrad ATF_TP_ADD_TC(tp, modfl); 437 1.1 joerg 438 1.1 joerg return atf_no_error(); 439 1.1 joerg } 440