1/* public domain rewrite of isinf(3) */
2
3#ifdef __osf__
4
5#define _IEEE 1
6#include <nan.h>
7
8int
9isinf(double n)
10{
11    if (IsNANorINF(n) && IsINF(n)) {
12	return 1;
13    }
14    else {
15	return 0;
16    }
17}
18
19#else
20
21#include "ruby/config.h"
22
23#if defined(HAVE_FINITE) && defined(HAVE_ISNAN)
24
25#include <math.h>
26#ifdef HAVE_IEEEFP_H
27#include <ieeefp.h>
28#endif
29
30/*
31 * isinf may be provided only as a macro.
32 * ex. HP-UX, Solaris 10
33 * http://www.gnu.org/software/automake/manual/autoconf/Function-Portability.html
34 */
35#ifndef isinf
36int
37isinf(double n)
38{
39    return (!finite(n) && !isnan(n));
40}
41#endif
42
43#else
44
45#ifdef HAVE_STRING_H
46# include <string.h>
47#else
48# include <strings.h>
49#endif
50
51static double zero(void) { return 0.0; }
52static double one (void) { return 1.0; }
53static double inf (void) { return one() / zero(); }
54
55int
56isinf(double n)
57{
58    static double pinf = 0.0;
59    static double ninf = 0.0;
60
61    if (pinf == 0.0) {
62	pinf = inf();
63	ninf = -pinf;
64    }
65    return memcmp(&n, &pinf, sizeof n) == 0
66	|| memcmp(&n, &ninf, sizeof n) == 0;
67}
68#endif
69#endif
70