1#include <stdint.h> 2#include <stdio.h> 3#include "mtest.h" 4 5static struct f_ff t[] = { 6#include "sanity/modff.h" 7#include "special/modff.h" 8}; 9 10int main(void) 11{ 12 #pragma STDC FENV_ACCESS ON 13 float y, yi; 14 float d, di; 15 int e, i, err = 0; 16 struct f_ff *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 = modff(p->x, &yi); 26 e = fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); 27 28 /* TODO: fix inexact */ 29 if (!checkexceptall(e|INEXACT, p->e|INEXACT, p->r)) { 30 printf("%s:%d: bad fp exception: %s modff(%a)=%a,%a, want %s", 31 p->file, p->line, rstr(p->r), p->x, p->y, p->y2, estr(p->e)); 32 printf(" got %s\n", estr(e)); 33 err++; 34 } 35 d = ulperr(y, p->y, p->dy); 36 di = ulperr(yi, p->y2, p->dy2); 37 if (!checkcr(y, p->y, p->r) || !checkcr(yi, p->y2, p->r)) { 38 printf("%s:%d: %s modff(%a) want %a,%a got %a,%a, ulperr %.3f = %a + %a, %.3f = %a + %a\n", 39 p->file, p->line, rstr(p->r), p->x, p->y, p->y2, y, yi, d, d-p->dy, p->dy, di, di-p->dy2, p->dy2); 40 err++; 41 } 42 } 43 return !!err; 44} 45