1 /*************************************************************************
2  *
3  * $Id: trionan.h,v 1.9 2005/03/27 18:52:45 breese Exp $
4  *
5  * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
12  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
13  * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
14  * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
15  *
16  ************************************************************************/
17 
18 #ifndef TRIO_TRIONAN_H
19 #define TRIO_TRIONAN_H
20 
21 #include "triodef.h"
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #if !defined(TRIO_PUBLIC_NAN)
28 # if !defined(TRIO_PUBLIC)
29 #  define TRIO_PUBLIC
30 # endif
31 # define TRIO_PUBLIC_NAN TRIO_PUBLIC
32 #endif
33 
34 enum {
35   TRIO_FP_INFINITE,
36   TRIO_FP_NAN,
37   TRIO_FP_NORMAL,
38   TRIO_FP_SUBNORMAL,
39   TRIO_FP_ZERO
40 };
41 
42 /*************************************************************************
43  * Dependencies
44  */
45 
46 #if defined(TRIO_EMBED_NAN)
47 
48 /*
49  * The application that trionan is embedded in must define which functions
50  * it uses.
51  *
52  * The following resolves internal dependencies.
53  */
54 
55 # if defined(TRIO_FUNC_ISNAN) \
56   || defined(TRIO_FUNC_ISINF)
57 #  if !defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)
58 #   define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT
59 #  endif
60 # endif
61 
62 # if defined(TRIO_FUNC_NAN)
63 #  if !defined(TRIO_FUNC_PINF)
64 #   define TRIO_FUNC_PINF
65 #  endif
66 # endif
67 
68 # if defined(TRIO_FUNC_NINF)
69 #  if !defined(TRIO_FUNC_PINF)
70 #   define TRIO_FUNC_PINF
71 #  endif
72 # endif
73 
74 #else
75 
76 /*
77  * When trionan is not embedded all all functions are defined.
78  */
79 
80 # define TRIO_FUNC_NAN
81 # define TRIO_FUNC_PINF
82 # define TRIO_FUNC_NINF
83 # define TRIO_FUNC_NZERO
84 # define TRIO_FUNC_ISNAN
85 # define TRIO_FUNC_ISINF
86 # define TRIO_FUNC_ISFINITE
87 # define TRIO_FUNC_SIGNBIT
88 # define TRIO_FUNC_FPCLASSIFY
89 # define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT
90 
91 #endif
92 
93 /*************************************************************************
94  * Functions
95  */
96 
97 /*
98  * Return NaN (Not-a-Number).
99  */
100 #if defined(TRIO_FUNC_NAN)
101 TRIO_PUBLIC_NAN double
102 trio_nan
103 TRIO_PROTO((void));
104 #endif
105 
106 /*
107  * Return positive infinity.
108  */
109 #if defined(TRIO_FUNC_PINF)
110 TRIO_PUBLIC_NAN double
111 trio_pinf
112 TRIO_PROTO((void));
113 #endif
114 
115 /*
116  * Return negative infinity.
117  */
118 #if defined(TRIO_FUNC_NINF)
119 TRIO_PUBLIC_NAN double
120 trio_ninf
121 TRIO_PROTO((void));
122 #endif
123 
124 /*
125  * Return negative zero.
126  */
127 #if defined(TRIO_FUNC_NZERO)
128 TRIO_PUBLIC_NAN double
129 trio_nzero
130 TRIO_PROTO((TRIO_NOARGS));
131 #endif
132 
133 /*
134  * If number is a NaN return non-zero, otherwise return zero.
135  */
136 #if defined(TRIO_FUNC_ISNAN)
137 TRIO_PUBLIC_NAN int
138 trio_isnan
139 TRIO_PROTO((double number));
140 #endif
141 
142 /*
143  * If number is positive infinity return 1, if number is negative
144  * infinity return -1, otherwise return 0.
145  */
146 #if defined(TRIO_FUNC_ISINF)
147 TRIO_PUBLIC_NAN int
148 trio_isinf
149 TRIO_PROTO((double number));
150 #endif
151 
152 /*
153  * If number is finite return non-zero, otherwise return zero.
154  */
155 #if defined(TRIO_FUNC_ISFINITE)
156 TRIO_PUBLIC_NAN int
157 trio_isfinite
158 TRIO_PROTO((double number));
159 #endif
160 
161 #if defined(TRIO_FUNC_SIGNBIT)
162 TRIO_PUBLIC_NAN int
163 trio_signbit
164 TRIO_PROTO((double number));
165 #endif
166 
167 #if defined(TRIO_FUNC_FPCLASSIFY)
168 TRIO_PUBLIC_NAN int
169 trio_fpclassify
170 TRIO_PROTO((double number));
171 #endif
172 
173 #if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)
174 TRIO_PUBLIC_NAN int
175 trio_fpclassify_and_signbit
176 TRIO_PROTO((double number, int *is_negative));
177 #endif
178 
179 #ifdef __cplusplus
180 }
181 #endif
182 
183 #endif /* TRIO_TRIONAN_H */
184