1#define _DEFAULT_SOURCE 1 2#define _BSD_SOURCE 1 3#define _GNU_SOURCE 1 4#include <stdint.h> 5#include <stdio.h> 6#include "mtest.h" 7 8static struct d_di t[] = { 9#include "sanity/lgamma_r.h" 10#include "special/lgamma_r.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 d_di *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 = lgamma_r(p->x, &yi); 31 e = fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); 32 33 if (!checkexcept(e, p->e, p->r)) { 34 printf("%s:%d: bad fp exception: %s lgamma_r(%a)=%a,%lld, want %s", 35 p->file, p->line, rstr(p->r), p->x, p->y, p->i, estr(p->e)); 36 printf(" got %s\n", estr(e)); 37 err++; 38 } 39 d = ulperr(y, p->y, p->dy); 40 bad = !isnan(p->x) && p->x!=-inf && !(p->e&DIVBYZERO) && yi != p->i; 41 if (bad || !checkulp(d, p->r)) { 42 if (!bad && fabsf(d) < 11.0f) 43 printf("X "); 44 else 45 err++; 46 printf("%s:%d: %s lgamma_r(%a) want %a,%lld got %a,%d ulperr %.3f = %a + %a\n", 47 p->file, p->line, rstr(p->r), p->x, p->y, p->i, y, yi, d, d-p->dy, p->dy); 48 } 49 } 50 return !!err; 51} 52