6 static int test_status;
8 #define error(...) print(__FILE__, __LINE__, __VA_ARGS__)
9 static void print(char *f, int l, char *fmt, ...)
13 printf("%s:%d: ", f, l);
42 static void test_except()
44 #pragma STDC FENV_ACCESS ON
47 for (i=0; i < sizeof te/sizeof*te; i++) {
48 feclearexcept(FE_ALL_EXCEPT);
50 r = feraiseexcept(te[i].i);
52 error("feraiseexcept(%s) returned %d\n", te[i].name, r);
53 r = fetestexcept(FE_ALL_EXCEPT);
55 error("feraiseexcept(%s) want %d got %d\n",
56 te[i].name, te[i].i, r);
76 static void test_round()
78 #pragma STDC FENV_ACCESS ON
81 for (i=0; i < sizeof tr/sizeof*tr; i++) {
83 error("%s (%d) < 0\n", tr[i].name, tr[i].i);
85 if (tr[r].i == tr[i].i)
86 error("%s (%d) == %s (%d)\n",
87 tr[r].name, tr[r].i, tr[i].name, tr[i].i);
90 for (i=0; i < sizeof tr/sizeof*tr; i++) {
91 r = fesetround(tr[i].i);
93 error("fesetround %d\n", r);
96 error("fegetround %x wanted %x\n", r, tr[i].i);
100 /* ieee double precision add operation */
101 static struct dd_d t[] = {
102 T(RN, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
103 T(RN, 0x1p+0, 0x1p-53, 0x1p+0, -0x1p-1, INEXACT)
104 T(RN, 0x1p+0, 0x1.01p-53, 0x1.0000000000001p+0, 0x1.fep-2, INEXACT)
105 T(RN, 0x1p+0, -0x1p-54, 0x1p+0, 0x1p-2, INEXACT)
106 T(RN, 0x1p+0, -0x1.01p-54, 0x1.fffffffffffffp-1, -0x1.fep-2, INEXACT)
107 T(RN, -0x1p+0, -0x1p-53, -0x1p+0, 0x1p-1, INEXACT)
108 T(RN, -0x1p+0, -0x1.01p-53, -0x1.0000000000001p+0, -0x1.fep-2, INEXACT)
109 T(RN, -0x1p+0, 0x1p-54, -0x1p+0, -0x1p-2, INEXACT)
110 T(RN, -0x1p+0, 0x1.01p-54, -0x1.fffffffffffffp-1, 0x1.fep-2, INEXACT)
112 T(RU, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
113 T(RU, 0x1p+0, 0x1p-53, 0x1.0000000000001p+0, 0x1p-1, INEXACT)
114 T(RU, 0x1p+0, 0x1.01p-53, 0x1.0000000000001p+0, 0x1.fep-2, INEXACT)
115 T(RU, 0x1p+0, -0x1p-54, 0x1p+0, 0x1p-2, INEXACT)
116 T(RU, 0x1p+0, -0x1.01p-54, 0x1p+0, 0x1.01p-2, INEXACT)
117 T(RU, -0x1p+0, -0x1p-53, -0x1p+0, 0x1p-1, INEXACT)
118 T(RU, -0x1p+0, -0x1.01p-53, -0x1p+0, 0x1.01p-1, INEXACT)
119 T(RU, -0x1p+0, 0x1p-54, -0x1.fffffffffffffp-1, 0x1p-1, INEXACT)
120 T(RU, -0x1p+0, 0x1.01p-54, -0x1.fffffffffffffp-1, 0x1.fep-2, INEXACT)
122 T(RD, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
123 T(RD, 0x1p+0, 0x1p-53, 0x1p+0, -0x1p-1, INEXACT)
124 T(RD, 0x1p+0, 0x1.01p-53, 0x1p+0, -0x1.01p-1, INEXACT)
125 T(RD, 0x1p+0, -0x1p-54, 0x1.fffffffffffffp-1, -0x1p-1, INEXACT)
126 T(RD, 0x1p+0, -0x1.01p-54, 0x1.fffffffffffffp-1, -0x1.fep-2, INEXACT)
127 T(RD, -0x1p+0, -0x1p-53, -0x1.0000000000001p+0, -0x1p-1, INEXACT)
128 T(RD, -0x1p+0, -0x1.01p-53, -0x1.0000000000001p+0, -0x1.fep-2, INEXACT)
129 T(RD, -0x1p+0, 0x1p-54, -0x1p+0, -0x1p-2, INEXACT)
130 T(RD, -0x1p+0, 0x1.01p-54, -0x1p+0, -0x1.01p-2, INEXACT)
132 T(RZ, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
133 T(RZ, 0x1p+0, 0x1p-53, 0x1p+0, -0x1p-1, INEXACT)
134 T(RZ, 0x1p+0, 0x1.01p-53, 0x1p+0, -0x1.01p-1, INEXACT)
135 T(RZ, 0x1p+0, -0x1p-54, 0x1.fffffffffffffp-1, -0x1p-1, INEXACT)
136 T(RZ, 0x1p+0, -0x1.01p-54, 0x1.fffffffffffffp-1, -0x1.fep-2, INEXACT)
137 T(RZ, -0x1p+0, -0x1p-53, -0x1p+0, 0x1p-1, INEXACT)
138 T(RZ, -0x1p+0, -0x1.01p-53, -0x1p+0, 0x1.01p-1, INEXACT)
139 T(RZ, -0x1p+0, 0x1p-54, -0x1.fffffffffffffp-1, 0x1p-1, INEXACT)
140 T(RZ, -0x1p+0, 0x1.01p-54, -0x1.fffffffffffffp-1, 0x1.fep-2, INEXACT)
143 static void test_round_add(void)
145 #pragma STDC FENV_ACCESS ON
151 for (i = 0; i < sizeof t/sizeof *t; i++) {
158 d = ulperr(y, p->y, p->dy);
159 if (!checkcr(y, p->y, p->r)) {
160 printf("%s:%d: %s %a+%a want %a got %a ulperr %.3f = %a + %a\n",
161 p->file, p->line, rstr(p->r), p->x, p->x2, p->y, y, d, d-p->dy, p->dy);