t_round.c revision 1.1 1 1.1 jruoho /* $NetBSD: t_round.c,v 1.1 2011/04/08 06:49:21 jruoho Exp $ */
2 1.1 jruoho
3 1.1 jruoho #include <atf-c.h>
4 1.1 jruoho #include <math.h>
5 1.1 jruoho
6 1.1 jruoho /*
7 1.1 jruoho * This tests for a bug in the initial implementation where
8 1.1 jruoho * precision was lost in an internal substraction, leading to
9 1.1 jruoho * rounding into the wrong direction.
10 1.1 jruoho */
11 1.1 jruoho
12 1.1 jruoho /* 0.5 - EPSILON */
13 1.1 jruoho #define VAL 0x0.7ffffffffffffcp0
14 1.1 jruoho #define VALF 0x0.7fffff8p0
15 1.1 jruoho
16 1.1 jruoho ATF_TC(round_dir);
17 1.1 jruoho ATF_TC_HEAD(round_dir, tc)
18 1.1 jruoho {
19 1.1 jruoho atf_tc_set_md_var(tc, "descr","Check for rounding in wrong direction");
20 1.1 jruoho }
21 1.1 jruoho
22 1.1 jruoho ATF_TC_BODY(round_dir, tc)
23 1.1 jruoho {
24 1.1 jruoho double a = VAL, b, c;
25 1.1 jruoho float af = VALF, bf, cf;
26 1.1 jruoho
27 1.1 jruoho b = round(a);
28 1.1 jruoho bf = roundf(af);
29 1.1 jruoho
30 1.1 jruoho ATF_REQUIRE(fabs(b) < 1.0e-40);
31 1.1 jruoho ATF_REQUIRE(fabsf(bf) < 1.0e-40);
32 1.1 jruoho
33 1.1 jruoho c = round(-a);
34 1.1 jruoho cf = roundf(-af);
35 1.1 jruoho
36 1.1 jruoho ATF_REQUIRE(fabs(c) < 1.0e-40);
37 1.1 jruoho ATF_REQUIRE(fabsf(cf) < 1.0e-40);
38 1.1 jruoho }
39 1.1 jruoho
40 1.1 jruoho ATF_TP_ADD_TCS(tp)
41 1.1 jruoho {
42 1.1 jruoho
43 1.1 jruoho ATF_TP_ADD_TC(tp, round_dir);
44 1.1 jruoho
45 1.1 jruoho return atf_no_error();
46 1.1 jruoho }
47