Home | History | Annotate | Line # | Download | only in libm
t_ceil.c revision 1.7
      1 /* $NetBSD: t_ceil.c,v 1.7 2011/09/17 12:12:19 jruoho Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Jukka Ruohonen.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 #include <sys/cdefs.h>
     32 __RCSID("$NetBSD: t_ceil.c,v 1.7 2011/09/17 12:12:19 jruoho Exp $");
     33 
     34 #include <atf-c.h>
     35 #include <math.h>
     36 #include <limits.h>
     37 #include <stdio.h>
     38 
     39 #ifdef __vax__
     40 #define SMALL_NUM	1.0e-38
     41 #else
     42 #define SMALL_NUM	1.0e-40
     43 #endif
     44 
     45 /*
     46  * ceil(3)
     47  */
     48 ATF_TC(ceil_basic);
     49 ATF_TC_HEAD(ceil_basic, tc)
     50 {
     51 	atf_tc_set_md_var(tc, "descr", "A basic test of ceil(3)");
     52 }
     53 
     54 ATF_TC_BODY(ceil_basic, tc)
     55 {
     56 	const double x = 0.999999999999999;
     57 	const double y = 0.000000000000001;
     58 
     59 	ATF_CHECK(fabs(ceil(x) - 1) < SMALL_NUM);
     60 	ATF_CHECK(fabs(ceil(y) - 1) < SMALL_NUM);
     61 }
     62 
     63 ATF_TC(ceil_nan);
     64 ATF_TC_HEAD(ceil_nan, tc)
     65 {
     66 	atf_tc_set_md_var(tc, "descr", "Test ceil(NaN) == NaN");
     67 }
     68 
     69 ATF_TC_BODY(ceil_nan, tc)
     70 {
     71 #ifndef __vax__
     72 	const double x = 0.0L / 0.0L;
     73 
     74 	ATF_CHECK(isnan(ceil(x)) != 0);
     75 #endif
     76 }
     77 
     78 ATF_TC(ceil_inf_neg);
     79 ATF_TC_HEAD(ceil_inf_neg, tc)
     80 {
     81 	atf_tc_set_md_var(tc, "descr", "Test ceil(-Inf) == -Inf");
     82 }
     83 
     84 ATF_TC_BODY(ceil_inf_neg, tc)
     85 {
     86 #ifndef __vax__
     87 	const double x = -1.0L / 0.0L;
     88 	double y = ceil(x);
     89 
     90 	if (isinf(y) == 0 || signbit(y) == 0)
     91 		atf_tc_fail_nonfatal("ceil(-Inf) != -Inf");
     92 #endif
     93 }
     94 
     95 ATF_TC(ceil_inf_pos);
     96 ATF_TC_HEAD(ceil_inf_pos, tc)
     97 {
     98 	atf_tc_set_md_var(tc, "descr", "Test ceil(+Inf) == +Inf");
     99 }
    100 
    101 ATF_TC_BODY(ceil_inf_pos, tc)
    102 {
    103 #ifndef __vax__
    104 	const double x = 1.0L / 0.0L;
    105 	double y = ceil(x);
    106 
    107 	if (isinf(y) == 0 || signbit(y) != 0)
    108 		atf_tc_fail_nonfatal("ceil(+Inf) != +Inf");
    109 #endif
    110 }
    111 
    112 ATF_TC(ceil_zero_neg);
    113 ATF_TC_HEAD(ceil_zero_neg, tc)
    114 {
    115 	atf_tc_set_md_var(tc, "descr", "Test ceil(-0.0) == -0.0");
    116 }
    117 
    118 ATF_TC_BODY(ceil_zero_neg, tc)
    119 {
    120 #ifndef __vax__
    121 	const double x = -0.0L;
    122 	double y = ceil(x);
    123 
    124 	if (fabs(y) > 0.0 || signbit(y) == 0)
    125 		atf_tc_fail_nonfatal("ceil(-0.0) != -0.0");
    126 #endif
    127 }
    128 
    129 ATF_TC(ceil_zero_pos);
    130 ATF_TC_HEAD(ceil_zero_pos, tc)
    131 {
    132 	atf_tc_set_md_var(tc, "descr", "Test ceil(+0.0) == +0.0");
    133 }
    134 
    135 ATF_TC_BODY(ceil_zero_pos, tc)
    136 {
    137 #ifndef __vax__
    138 	const double x = 0.0L;
    139 	double y = ceil(x);
    140 
    141 	if (fabs(y) > 0.0 || signbit(y) != 0)
    142 		atf_tc_fail_nonfatal("ceil(+0.0) != +0.0");
    143 #endif
    144 }
    145 
    146 /*
    147  * ceilf(3)
    148  */
    149 ATF_TC(ceilf_basic);
    150 ATF_TC_HEAD(ceilf_basic, tc)
    151 {
    152 	atf_tc_set_md_var(tc, "descr", "A basic test of ceilf(3)");
    153 }
    154 
    155 ATF_TC_BODY(ceilf_basic, tc)
    156 {
    157 	const float x = 0.9999999;
    158 	const float y = 0.0000001;
    159 
    160 	ATF_CHECK(fabsf(ceilf(x) - 1) < SMALL_NUM);
    161 	ATF_CHECK(fabsf(ceilf(y) - 1) < SMALL_NUM);
    162 }
    163 
    164 ATF_TC(ceilf_nan);
    165 ATF_TC_HEAD(ceilf_nan, tc)
    166 {
    167 	atf_tc_set_md_var(tc, "descr", "Test ceilf(NaN) == NaN");
    168 }
    169 
    170 ATF_TC_BODY(ceilf_nan, tc)
    171 {
    172 #ifndef __vax__
    173 	const float x = 0.0L / 0.0L;
    174 
    175 	ATF_CHECK(isnan(ceilf(x)) != 0);
    176 #endif
    177 }
    178 
    179 ATF_TC(ceilf_inf_neg);
    180 ATF_TC_HEAD(ceilf_inf_neg, tc)
    181 {
    182 	atf_tc_set_md_var(tc, "descr", "Test ceilf(-Inf) == -Inf");
    183 }
    184 
    185 ATF_TC_BODY(ceilf_inf_neg, tc)
    186 {
    187 #ifndef __vax__
    188 	const float x = -1.0L / 0.0L;
    189 	float y = ceilf(x);
    190 
    191 	if (isinf(y) == 0 || signbit(y) == 0)
    192 		atf_tc_fail_nonfatal("ceilf(-Inf) != -Inf");
    193 #endif
    194 }
    195 
    196 ATF_TC(ceilf_inf_pos);
    197 ATF_TC_HEAD(ceilf_inf_pos, tc)
    198 {
    199 	atf_tc_set_md_var(tc, "descr", "Test ceilf(+Inf) == +Inf");
    200 }
    201 
    202 ATF_TC_BODY(ceilf_inf_pos, tc)
    203 {
    204 #ifndef __vax__
    205 	const float x = 1.0L / 0.0L;
    206 	float y = ceilf(x);
    207 
    208 	if (isinf(y) == 0 || signbit(y) != 0)
    209 		atf_tc_fail_nonfatal("ceilf(+Inf) != +Inf");
    210 #endif
    211 }
    212 
    213 ATF_TC(ceilf_zero_neg);
    214 ATF_TC_HEAD(ceilf_zero_neg, tc)
    215 {
    216 	atf_tc_set_md_var(tc, "descr", "Test ceilf(-0.0) == -0.0");
    217 }
    218 
    219 ATF_TC_BODY(ceilf_zero_neg, tc)
    220 {
    221 #ifndef __vax__
    222 	const float x = -0.0L;
    223 	float y = ceilf(x);
    224 
    225 	if (fabsf(y) > 0.0 || signbit(y) == 0)
    226 		atf_tc_fail_nonfatal("ceilf(-0.0) != -0.0");
    227 #endif
    228 }
    229 
    230 ATF_TC(ceilf_zero_pos);
    231 ATF_TC_HEAD(ceilf_zero_pos, tc)
    232 {
    233 	atf_tc_set_md_var(tc, "descr", "Test ceilf(+0.0) == +0.0");
    234 }
    235 
    236 ATF_TC_BODY(ceilf_zero_pos, tc)
    237 {
    238 #ifndef __vax__
    239 	const float x = 0.0L;
    240 	float y = ceilf(x);
    241 
    242 	if (fabsf(y) > 0.0 || signbit(y) != 0)
    243 		atf_tc_fail_nonfatal("ceilf(+0.0) != +0.0");
    244 #endif
    245 }
    246 
    247 /*
    248  * floor(3)
    249  */
    250 ATF_TC(floor_basic);
    251 ATF_TC_HEAD(floor_basic, tc)
    252 {
    253 	atf_tc_set_md_var(tc, "descr", "A basic test of floor(3)");
    254 }
    255 
    256 ATF_TC_BODY(floor_basic, tc)
    257 {
    258 	const double x = 0.999999999999999;
    259 	const double y = 0.000000000000001;
    260 
    261 	ATF_CHECK(floor(x) < SMALL_NUM);
    262 	ATF_CHECK(floor(y) < SMALL_NUM);
    263 }
    264 
    265 ATF_TC(floor_nan);
    266 ATF_TC_HEAD(floor_nan, tc)
    267 {
    268 	atf_tc_set_md_var(tc, "descr", "Test floor(NaN) == NaN");
    269 }
    270 
    271 ATF_TC_BODY(floor_nan, tc)
    272 {
    273 #ifndef __vax__
    274 	const double x = 0.0L / 0.0L;
    275 
    276 	ATF_CHECK(isnan(floor(x)) != 0);
    277 #endif
    278 }
    279 
    280 ATF_TC(floor_inf_neg);
    281 ATF_TC_HEAD(floor_inf_neg, tc)
    282 {
    283 	atf_tc_set_md_var(tc, "descr", "Test floor(-Inf) == -Inf");
    284 }
    285 
    286 ATF_TC_BODY(floor_inf_neg, tc)
    287 {
    288 #ifndef __vax__
    289 	const double x = -1.0L / 0.0L;
    290 	double y = floor(x);
    291 
    292 	if (isinf(y) == 0 || signbit(y) == 0)
    293 		atf_tc_fail_nonfatal("floor(-Inf) != -Inf");
    294 #endif
    295 }
    296 
    297 ATF_TC(floor_inf_pos);
    298 ATF_TC_HEAD(floor_inf_pos, tc)
    299 {
    300 	atf_tc_set_md_var(tc, "descr", "Test floor(+Inf) == +Inf");
    301 }
    302 
    303 ATF_TC_BODY(floor_inf_pos, tc)
    304 {
    305 #ifndef __vax__
    306 	const double x = 1.0L / 0.0L;
    307 	double y = floor(x);
    308 
    309 	if (isinf(y) == 0 || signbit(y) != 0)
    310 		atf_tc_fail_nonfatal("floor(+Inf) != +Inf");
    311 #endif
    312 }
    313 
    314 ATF_TC(floor_zero_neg);
    315 ATF_TC_HEAD(floor_zero_neg, tc)
    316 {
    317 	atf_tc_set_md_var(tc, "descr", "Test floor(-0.0) == -0.0");
    318 }
    319 
    320 ATF_TC_BODY(floor_zero_neg, tc)
    321 {
    322 #ifndef __vax__
    323 	const double x = -0.0L;
    324 	double y = floor(x);
    325 
    326 	if (fabs(y) > 0.0 || signbit(y) == 0)
    327 		atf_tc_fail_nonfatal("floor(-0.0) != -0.0");
    328 #endif
    329 }
    330 
    331 ATF_TC(floor_zero_pos);
    332 ATF_TC_HEAD(floor_zero_pos, tc)
    333 {
    334 	atf_tc_set_md_var(tc, "descr", "Test floor(+0.0) == +0.0");
    335 }
    336 
    337 ATF_TC_BODY(floor_zero_pos, tc)
    338 {
    339 #ifndef __vax__
    340 	const double x = 0.0L;
    341 	double y = floor(x);
    342 
    343 	if (fabs(y) > 0.0 || signbit(y) != 0)
    344 		atf_tc_fail_nonfatal("floor(+0.0) != +0.0");
    345 #endif
    346 }
    347 
    348 /*
    349  * floorf(3)
    350  */
    351 ATF_TC(floorf_basic);
    352 ATF_TC_HEAD(floorf_basic, tc)
    353 {
    354 	atf_tc_set_md_var(tc, "descr", "A basic test of floorf(3)");
    355 }
    356 
    357 ATF_TC_BODY(floorf_basic, tc)
    358 {
    359 	const float x = 0.9999999;
    360 	const float y = 0.0000001;
    361 
    362 	ATF_CHECK(floorf(x) < SMALL_NUM);
    363 	ATF_CHECK(floorf(y) < SMALL_NUM);
    364 }
    365 
    366 ATF_TC(floorf_nan);
    367 ATF_TC_HEAD(floorf_nan, tc)
    368 {
    369 	atf_tc_set_md_var(tc, "descr", "Test floorf(NaN) == NaN");
    370 }
    371 
    372 ATF_TC_BODY(floorf_nan, tc)
    373 {
    374 #ifndef __vax__
    375 	const float x = 0.0L / 0.0L;
    376 
    377 	ATF_CHECK(isnan(floorf(x)) != 0);
    378 #endif
    379 }
    380 
    381 ATF_TC(floorf_inf_neg);
    382 ATF_TC_HEAD(floorf_inf_neg, tc)
    383 {
    384 	atf_tc_set_md_var(tc, "descr", "Test floorf(-Inf) == -Inf");
    385 }
    386 
    387 ATF_TC_BODY(floorf_inf_neg, tc)
    388 {
    389 #ifndef __vax__
    390 	const float x = -1.0L / 0.0L;
    391 	float y = floorf(x);
    392 
    393 	if (isinf(y) == 0 || signbit(y) == 0)
    394 		atf_tc_fail_nonfatal("floorf(-Inf) != -Inf");
    395 #endif
    396 }
    397 
    398 ATF_TC(floorf_inf_pos);
    399 ATF_TC_HEAD(floorf_inf_pos, tc)
    400 {
    401 	atf_tc_set_md_var(tc, "descr", "Test floorf(+Inf) == +Inf");
    402 }
    403 
    404 ATF_TC_BODY(floorf_inf_pos, tc)
    405 {
    406 #ifndef __vax__
    407 	const float x = 1.0L / 0.0L;
    408 	float y = floorf(x);
    409 
    410 	if (isinf(y) == 0 || signbit(y) != 0)
    411 		atf_tc_fail_nonfatal("floorf(+Inf) != +Inf");
    412 #endif
    413 }
    414 
    415 ATF_TC(floorf_zero_neg);
    416 ATF_TC_HEAD(floorf_zero_neg, tc)
    417 {
    418 	atf_tc_set_md_var(tc, "descr", "Test floorf(-0.0) == -0.0");
    419 }
    420 
    421 ATF_TC_BODY(floorf_zero_neg, tc)
    422 {
    423 #ifndef __vax__
    424 	const float x = -0.0L;
    425 	float y = floorf(x);
    426 
    427 	if (fabsf(y) > 0.0 || signbit(y) == 0)
    428 		atf_tc_fail_nonfatal("floorf(-0.0) != -0.0");
    429 #endif
    430 }
    431 
    432 ATF_TC(floorf_zero_pos);
    433 ATF_TC_HEAD(floorf_zero_pos, tc)
    434 {
    435 	atf_tc_set_md_var(tc, "descr", "Test floorf(+0.0) == +0.0");
    436 }
    437 
    438 ATF_TC_BODY(floorf_zero_pos, tc)
    439 {
    440 #ifndef __vax__
    441 	const float x = 0.0L;
    442 	float y = floorf(x);
    443 
    444 	if (fabsf(y) > 0.0 || signbit(y) != 0)
    445 		atf_tc_fail_nonfatal("floorf(+0.0) != +0.0");
    446 #endif
    447 }
    448 
    449 ATF_TP_ADD_TCS(tp)
    450 {
    451 
    452 	ATF_TP_ADD_TC(tp, ceil_basic);
    453 	ATF_TP_ADD_TC(tp, ceil_nan);
    454 	ATF_TP_ADD_TC(tp, ceil_inf_neg);
    455 	ATF_TP_ADD_TC(tp, ceil_inf_pos);
    456 	ATF_TP_ADD_TC(tp, ceil_zero_neg);
    457 	ATF_TP_ADD_TC(tp, ceil_zero_pos);
    458 
    459 	ATF_TP_ADD_TC(tp, ceilf_basic);
    460 	ATF_TP_ADD_TC(tp, ceilf_nan);
    461 	ATF_TP_ADD_TC(tp, ceilf_inf_neg);
    462 	ATF_TP_ADD_TC(tp, ceilf_inf_pos);
    463 	ATF_TP_ADD_TC(tp, ceilf_zero_neg);
    464 	ATF_TP_ADD_TC(tp, ceilf_zero_pos);
    465 
    466 	ATF_TP_ADD_TC(tp, floor_basic);
    467 	ATF_TP_ADD_TC(tp, floor_nan);
    468 	ATF_TP_ADD_TC(tp, floor_inf_neg);
    469 	ATF_TP_ADD_TC(tp, floor_inf_pos);
    470 	ATF_TP_ADD_TC(tp, floor_zero_neg);
    471 	ATF_TP_ADD_TC(tp, floor_zero_pos);
    472 
    473 	ATF_TP_ADD_TC(tp, floorf_basic);
    474 	ATF_TP_ADD_TC(tp, floorf_nan);
    475 	ATF_TP_ADD_TC(tp, floorf_inf_neg);
    476 	ATF_TP_ADD_TC(tp, floorf_inf_pos);
    477 	ATF_TP_ADD_TC(tp, floorf_zero_neg);
    478 	ATF_TP_ADD_TC(tp, floorf_zero_pos);
    479 
    480 	return atf_no_error();
    481 }
    482