1#include <stdint.h> 2#include <stdio.h> 3#include "mtest.h" 4 5static struct l_l t[] = { 6#if LDBL_MANT_DIG == 53 7#include "crlibm/sin.h" 8#include "ucb/sin.h" 9#include "sanity/sin.h" 10#include "special/sin.h" 11 12#elif LDBL_MANT_DIG == 64 13#include "sanity/sinl.h" 14#include "special/sinl.h" 15 16#endif 17}; 18 19int main(void) 20{ 21 #pragma STDC FENV_ACCESS ON 22 long double y; 23 float d; 24 int e, i, err = 0; 25 struct l_l *p; 26 27 for (i = 0; i < sizeof t/sizeof *t; i++) { 28 p = t + i; 29 30 if (p->r < 0) 31 continue; 32 fesetround(p->r); 33 feclearexcept(FE_ALL_EXCEPT); 34 y = sinl(p->x); 35 e = fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); 36 37 if (!checkexcept(e, p->e, p->r)) { 38 printf("%s:%d: bad fp exception: %s sinl(%La)=%La, want %s", 39 p->file, p->line, rstr(p->r), p->x, p->y, estr(p->e)); 40 printf(" got %s\n", estr(e)); 41 err++; 42 } 43 d = ulperrl(y, p->y, p->dy); 44 if (!checkulp(d, p->r)) { 45 printf("%s:%d: %s sinl(%La) want %La got %La ulperr %.3f = %a + %a\n", 46 p->file, p->line, rstr(p->r), p->x, p->y, y, d, d-p->dy, p->dy); 47 err++; 48 } 49 } 50 return !!err; 51} 52