1/*	$OpenBSD: tgamma.c,v 1.3 2016/10/24 15:34:59 otto Exp $	*/
2
3/*	Written by Martynas Venckus, 2008,  Public domain.	*/
4
5#include <err.h>
6#include <errno.h>
7#include <math.h>
8#include <float.h>
9
10extern int errno;
11
12#if defined(__vax__)
13#define _IEEE		0
14#else
15#define _IEEE		1
16#endif
17
18double
19infnan(int iarg)
20{
21	switch (iarg) {
22	case  ERANGE:
23		errno = ERANGE;
24		return (HUGE);
25	case -ERANGE:
26		errno = EDOM;
27		return (-HUGE);
28	default:
29		errno = EDOM;
30		return (0);
31	}
32}
33
34int
35_isinf(double x)
36{
37	if (_IEEE) {
38		return isinf(x);
39	}
40	else {
41		return errno == ERANGE;
42	}
43}
44
45int
46_isnan(double x)
47{
48	if (_IEEE) {
49		return isnan(x);
50	}
51	else {
52		return errno == ERANGE;
53	}
54}
55
56int
57main(void)
58{
59	double x;
60
61	/* Random values, approx. -177.79..171.63 */
62	x = tgamma(11.0);			/* (11 - 1)! */
63	if (floor(x) != 3628800.0)
64		errx(1, "tgamma(11.0) = %f", x);
65
66	x = tgamma(3.5);			/* 15/8 * sqrt(pi) */
67	if (floor(x * 100) != 332.0)
68		errx(1, "tgamma(3.5) = %f", x);
69
70	x = tgamma(-0.5);			/* -2 * sqrt(pi) */
71	if (floor(x * 100) != -355.0)
72		errx(1, "tgamma(-0.5) = %f", x);
73
74	/* Special cases */
75	x = tgamma(-1);				/* Negative integers */
76	if (!_isnan(x))
77		errx(1, "tgamma(-1) = %f", x);
78
79	x = tgamma(-177.8);			/* x ~< -177.79 */
80	if (fabs(x) > DBL_EPSILON)
81		errx(1, "tgamma(-177.8) = %f", x);
82
83	x = tgamma(171.64);			/* x ~> 171.63 */
84	if (!_isinf(x))
85		errx(1, "tgamma(171.64) = %f", x);
86
87	x = tgamma(0.0);
88	if (!_isinf(x) || x < 0)
89		errx(1, "tgamma(0) = %f", x);
90
91	x = tgamma(-0.0);
92	if (!_isinf(x) || x > 0)
93		errx(1, "tgamma(0) = %f", x);
94
95	x = tgamma(-HUGE_VAL);
96	if (!_isnan(x))
97		errx(1, "tgamma(-HUGE_VAL) = %f", x);
98
99	x = tgamma(HUGE_VAL);
100	if (!_isinf(x))
101		errx(1, "tgamma(HUGE_VAL) = %f", x);
102
103#ifdef NAN
104	x = tgamma(NAN);
105	if (!_isnan(x))
106		errx(1, "tgamma(NaN) = %f", x);
107#endif
108
109	return 0;
110}
111