t_round.c revision 1.2 1 1.2 mrg /* $NetBSD: t_round.c,v 1.2 2011/07/04 22:33:29 mrg 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.2 mrg #ifdef __vax__
17 1.2 mrg #define SMALL_NUM 1.0e-38
18 1.2 mrg #else
19 1.2 mrg #define SMALL_NUM 1.0e-40
20 1.2 mrg #endif
21 1.2 mrg
22 1.1 jruoho ATF_TC(round_dir);
23 1.1 jruoho ATF_TC_HEAD(round_dir, tc)
24 1.1 jruoho {
25 1.1 jruoho atf_tc_set_md_var(tc, "descr","Check for rounding in wrong direction");
26 1.1 jruoho }
27 1.1 jruoho
28 1.1 jruoho ATF_TC_BODY(round_dir, tc)
29 1.1 jruoho {
30 1.1 jruoho double a = VAL, b, c;
31 1.1 jruoho float af = VALF, bf, cf;
32 1.1 jruoho
33 1.1 jruoho b = round(a);
34 1.1 jruoho bf = roundf(af);
35 1.1 jruoho
36 1.2 mrg ATF_REQUIRE(fabs(b) < SMALL_NUM);
37 1.2 mrg ATF_REQUIRE(fabsf(bf) < SMALL_NUM);
38 1.1 jruoho
39 1.1 jruoho c = round(-a);
40 1.1 jruoho cf = roundf(-af);
41 1.1 jruoho
42 1.2 mrg ATF_REQUIRE(fabs(c) < SMALL_NUM);
43 1.2 mrg ATF_REQUIRE(fabsf(cf) < SMALL_NUM);
44 1.1 jruoho }
45 1.1 jruoho
46 1.1 jruoho ATF_TP_ADD_TCS(tp)
47 1.1 jruoho {
48 1.1 jruoho
49 1.1 jruoho ATF_TP_ADD_TC(tp, round_dir);
50 1.1 jruoho
51 1.1 jruoho return atf_no_error();
52 1.1 jruoho }
53