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
48 for (i=0; i < sizeof te/sizeof*te; i++) {
49 feclearexcept(FE_ALL_EXCEPT);
51 r = feraiseexcept(te[i].i);
53 error("feraiseexcept(%s) returned %d\n", te[i].name, r);
54 r = fetestexcept(FE_ALL_EXCEPT);
56 error("feraiseexcept(%s) want %d got %d\n",
57 te[i].name, te[i].i, r);
62 error("fegetenv(&env) = %d\n", r);
63 i = fetestexcept(FE_ALL_EXCEPT);
64 r = fesetenv(FE_DFL_ENV);
66 error("fesetenv(FE_DFL_ENV) = %d\n", r);
67 r = fetestexcept(FE_ALL_EXCEPT);
69 error("fesetenv(FE_DFL_ENV) did not clear exceptions: 0x%x\n", r);
72 error("fesetenv(&env) = %d\n", r);
73 r = fetestexcept(FE_ALL_EXCEPT);
75 error("fesetenv(&env) did not restore exceptions: 0x%x\n", r);
94 static void test_round()
96 #pragma STDC FENV_ACCESS ON
100 for (i=0; i < sizeof tr/sizeof*tr; i++) {
102 error("%s (%d) < 0\n", tr[i].name, tr[i].i);
103 for (r=0; r < i; r++)
104 if (tr[r].i == tr[i].i)
105 error("%s (%d) == %s (%d)\n",
106 tr[r].name, tr[r].i, tr[i].name, tr[i].i);
109 for (i=0; i < sizeof tr/sizeof*tr; i++) {
110 r = fesetround(tr[i].i);
112 error("fesetround(%s) = %d\n", tr[i].name, r);
115 error("fegetround() = 0x%x, wanted 0x%x (%s)\n", r, tr[i].i, tr[i].name);
120 error("fegetenv(&env) = %d\n", r);
122 r = fesetenv(FE_DFL_ENV);
124 error("fesetenv(FE_DFL_ENV) = %d\n", r);
126 if (r != FE_TONEAREST)
127 error("fesetenv(FE_DFL_ENV) did not set FE_TONEAREST (0x%x), got 0x%x\n", FE_TONEAREST, r);
130 error("fesetenv(&env) = %d\n", r);
133 error("fesetenv(&env) did not restore 0x%x, got 0x%x\n", i, r);
136 /* ieee double precision add operation */
137 static struct dd_d t[] = {
138 T(RN, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
139 T(RN, 0x1p+0, 0x1p-53, 0x1p+0, -0x1p-1, INEXACT)
140 T(RN, 0x1p+0, 0x1.01p-53, 0x1.0000000000001p+0, 0x1.fep-2, INEXACT)
141 T(RN, 0x1p+0, -0x1p-54, 0x1p+0, 0x1p-2, INEXACT)
142 T(RN, 0x1p+0, -0x1.01p-54, 0x1.fffffffffffffp-1, -0x1.fep-2, INEXACT)
143 T(RN, -0x1p+0, -0x1p-53, -0x1p+0, 0x1p-1, INEXACT)
144 T(RN, -0x1p+0, -0x1.01p-53, -0x1.0000000000001p+0, -0x1.fep-2, INEXACT)
145 T(RN, -0x1p+0, 0x1p-54, -0x1p+0, -0x1p-2, INEXACT)
146 T(RN, -0x1p+0, 0x1.01p-54, -0x1.fffffffffffffp-1, 0x1.fep-2, INEXACT)
148 T(RU, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
149 T(RU, 0x1p+0, 0x1p-53, 0x1.0000000000001p+0, 0x1p-1, INEXACT)
150 T(RU, 0x1p+0, 0x1.01p-53, 0x1.0000000000001p+0, 0x1.fep-2, INEXACT)
151 T(RU, 0x1p+0, -0x1p-54, 0x1p+0, 0x1p-2, INEXACT)
152 T(RU, 0x1p+0, -0x1.01p-54, 0x1p+0, 0x1.01p-2, INEXACT)
153 T(RU, -0x1p+0, -0x1p-53, -0x1p+0, 0x1p-1, INEXACT)
154 T(RU, -0x1p+0, -0x1.01p-53, -0x1p+0, 0x1.01p-1, INEXACT)
155 T(RU, -0x1p+0, 0x1p-54, -0x1.fffffffffffffp-1, 0x1p-1, INEXACT)
156 T(RU, -0x1p+0, 0x1.01p-54, -0x1.fffffffffffffp-1, 0x1.fep-2, INEXACT)
158 T(RD, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
159 T(RD, 0x1p+0, 0x1p-53, 0x1p+0, -0x1p-1, INEXACT)
160 T(RD, 0x1p+0, 0x1.01p-53, 0x1p+0, -0x1.01p-1, INEXACT)
161 T(RD, 0x1p+0, -0x1p-54, 0x1.fffffffffffffp-1, -0x1p-1, INEXACT)
162 T(RD, 0x1p+0, -0x1.01p-54, 0x1.fffffffffffffp-1, -0x1.fep-2, INEXACT)
163 T(RD, -0x1p+0, -0x1p-53, -0x1.0000000000001p+0, -0x1p-1, INEXACT)
164 T(RD, -0x1p+0, -0x1.01p-53, -0x1.0000000000001p+0, -0x1.fep-2, INEXACT)
165 T(RD, -0x1p+0, 0x1p-54, -0x1p+0, -0x1p-2, INEXACT)
166 T(RD, -0x1p+0, 0x1.01p-54, -0x1p+0, -0x1.01p-2, INEXACT)
168 T(RZ, 0x1p+0, 0x1p-52, 0x1.0000000000001p+0, 0x0p+0, 0)
169 T(RZ, 0x1p+0, 0x1p-53, 0x1p+0, -0x1p-1, INEXACT)
170 T(RZ, 0x1p+0, 0x1.01p-53, 0x1p+0, -0x1.01p-1, INEXACT)
171 T(RZ, 0x1p+0, -0x1p-54, 0x1.fffffffffffffp-1, -0x1p-1, INEXACT)
172 T(RZ, 0x1p+0, -0x1.01p-54, 0x1.fffffffffffffp-1, -0x1.fep-2, INEXACT)
173 T(RZ, -0x1p+0, -0x1p-53, -0x1p+0, 0x1p-1, INEXACT)
174 T(RZ, -0x1p+0, -0x1.01p-53, -0x1p+0, 0x1.01p-1, INEXACT)
175 T(RZ, -0x1p+0, 0x1p-54, -0x1.fffffffffffffp-1, 0x1p-1, INEXACT)
176 T(RZ, -0x1p+0, 0x1.01p-54, -0x1.fffffffffffffp-1, 0x1.fep-2, INEXACT)
179 static void test_round_add(void)
181 #pragma STDC FENV_ACCESS ON
187 for (i = 0; i < sizeof t/sizeof *t; i++) {
194 d = ulperr(y, p->y, p->dy);
195 if (!checkcr(y, p->y, p->r)) {
196 printf("%s:%d: %s %a+%a want %a got %a ulperr %.3f = %a + %a\n",
197 p->file, p->line, rstr(p->r), p->x, p->x2, p->y, y, d, d-p->dy, p->dy);