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