1#include <stdint.h> 2#include <stdio.h> 3#include "util.h" 4 5static struct f_fi t[] = { 6HEADERS 7}; 8 9int main(void) 10{ 11 #pragma STDC FENV_ACCESS ON 12 int yi; 13 double y; 14 float d; 15 int e, i, err = 0; 16 struct f_fi *p; 17 18 for (i = 0; i < sizeof t/sizeof *t; i++) { 19 p = t + i; 20 21 if (p->r < 0) 22 continue; 23 fesetround(p->r); 24 feclearexcept(FE_ALL_EXCEPT); 25 y = ___(p->x, &yi); 26 e = fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); 27 28 if (!checkexcept(e, p->e, p->r)) { 29 printf("%s:%d: bad fp exception: %s ___(%a)=%a,%lld, want %s", 30 p->file, p->line, rstr(p->r), p->x, p->y, p->i, estr(p->e)); 31 printf(" got %s\n", estr(e)); 32 err++; 33 } 34 d = ulperrf(y, p->y, p->dy); 35 if (!checkulp(d, p->r) || yi != p->i) { 36 printf("%s:%d: %s ___(%a) want %a,%lld got %a,%d ulperr %.3f = %a + %a\n", 37 p->file, p->line, rstr(p->r), p->x, p->y, p->i, y, yi, d, d-p->dy, p->dy); 38 err++; 39 } 40 } 41 return !!err; 42} 43