xref: /illumos-gate/usr/src/head/floatingpoint.h (revision f7e4f33f27df122daef98e5b4b537dc159597da5)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*	Copyright (C) 1989 AT&T	*/
22 /*	  All Rights Reserved */
23 
24 /*
25  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
26  */
27 /*
28  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
29  * Use is subject to license terms.
30  */
31 
32 #ifndef _FLOATINGPOINT_H
33 #define	_FLOATINGPOINT_H
34 
35 #ifdef __STDC__
36 #include <stdio_tag.h>
37 #endif
38 #include <sys/ieeefp.h>
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 /*
45  * <floatingpoint.h> contains definitions for constants, types, variables,
46  * and functions for:
47  *	IEEE floating-point arithmetic base conversion;
48  *	IEEE floating-point arithmetic modes;
49  *	IEEE floating-point arithmetic exception handling.
50  */
51 
52 #ifndef __P
53 #ifdef __STDC__
54 #define	__P(p)	p
55 #else
56 #define	__P(p)	()
57 #endif
58 #endif	/* !defined(__P) */
59 
60 #if defined(__STDC__) && !defined(_FILEDEFED)
61 #define	_FILEDEFED
62 typedef	__FILE FILE;
63 #endif
64 
65 typedef int sigfpe_code_type;	/* Type of SIGFPE code. */
66 
67 typedef void (*sigfpe_handler_type)();	/* Pointer to exception handler */
68 
69 #define	SIGFPE_DEFAULT (void (*)())0	/* default exception handling */
70 #define	SIGFPE_IGNORE  (void (*)())1	/* ignore this exception or code */
71 #define	SIGFPE_ABORT   (void (*)())2	/* force abort on exception */
72 
73 extern sigfpe_handler_type sigfpe __P((sigfpe_code_type, sigfpe_handler_type));
74 
75 /*
76  * Types for IEEE floating point.
77  */
78 typedef float single;
79 
80 #ifndef _EXTENDED
81 #define	_EXTENDED
82 typedef unsigned extended[3];
83 #endif
84 
85 typedef long double quadruple;	/* Quadruple-precision type. */
86 
87 typedef unsigned fp_exception_field_type;
88 				/*
89 				 * A field containing fp_exceptions OR'ed
90 				 * together.
91 				 */
92 /*
93  * Definitions for base conversion.
94  */
95 #define	DECIMAL_STRING_LENGTH 512	/* Size of buffer in decimal_record. */
96 
97 typedef char decimal_string[DECIMAL_STRING_LENGTH];
98 				/* Decimal significand. */
99 
100 typedef struct {
101 	enum fp_class_type fpclass;
102 	int	sign;
103 	int	exponent;
104 	decimal_string ds;	/* Significand - each char contains an ascii */
105 				/* digit, except the string-terminating */
106 				/* ascii null. */
107 	int	more;		/* On conversion from decimal to binary, != 0 */
108 				/* indicates more non-zero digits following */
109 				/* ds. */
110 	int	ndigits;	/* On fixed_form conversion from binary to */
111 				/* decimal, contains number of digits */
112 				/* required for ds. */
113 } decimal_record;
114 
115 enum decimal_form {
116 	fixed_form,		/* Fortran F format: ndigits specifies number */
117 				/* of digits after point; if negative, */
118 				/* specifies rounding to occur to left of */
119 				/* point. */
120 	floating_form		/* Fortran E format: ndigits specifies number */
121 				/* of significant digits. */
122 };
123 
124 typedef struct {
125 	enum fp_direction_type rd;
126 				/* Rounding direction. */
127 	enum decimal_form df;	/* Format for conversion from binary to */
128 				/* decimal. */
129 	int ndigits;		/* Number of digits for conversion. */
130 } decimal_mode;
131 
132 enum decimal_string_form {	/* Valid decimal number string formats. */
133 	invalid_form,		/* Not a valid decimal string format. */
134 	whitespace_form,	/* All white space - valid in Fortran! */
135 	fixed_int_form,		/* <digs>		*/
136 	fixed_intdot_form,	/* <digs>.		*/
137 	fixed_dotfrac_form,	/* .<digs>		*/
138 	fixed_intdotfrac_form,	/* <digs>.<frac>	*/
139 	floating_int_form,	/* <digs><exp>		*/
140 	floating_intdot_form,	/* <digs>.<exp>		*/
141 	floating_dotfrac_form,	/* .<digs><exp>		*/
142 	floating_intdotfrac_form, /* <digs>.<digs><exp>	*/
143 	inf_form,		/* inf			*/
144 	infinity_form,		/* infinity		*/
145 	nan_form,		/* nan			*/
146 	nanstring_form		/* nan(string)		*/
147 };
148 
149 extern void single_to_decimal __P((single *, decimal_mode *, decimal_record *,
150 				fp_exception_field_type *));
151 extern void double_to_decimal __P((double *, decimal_mode *, decimal_record *,
152 				fp_exception_field_type *));
153 extern void extended_to_decimal __P((extended *, decimal_mode *,
154 				decimal_record *, fp_exception_field_type *));
155 extern void quadruple_to_decimal __P((quadruple *, decimal_mode *,
156 				decimal_record *, fp_exception_field_type *));
157 
158 extern void decimal_to_single __P((single *, decimal_mode *, decimal_record *,
159 				fp_exception_field_type *));
160 extern void decimal_to_double __P((double *, decimal_mode *, decimal_record *,
161 				fp_exception_field_type *));
162 extern void decimal_to_extended __P((extended *, decimal_mode *,
163 				decimal_record *, fp_exception_field_type *));
164 extern void decimal_to_quadruple __P((quadruple *, decimal_mode *,
165 				decimal_record *, fp_exception_field_type *));
166 
167 extern void string_to_decimal __P((char **, int, int, decimal_record *,
168 				enum decimal_string_form *, char **));
169 extern void func_to_decimal __P((char **, int, int, decimal_record *,
170 				enum decimal_string_form *, char **,
171 				int (*)(void), int *, int (*)(int)));
172 extern void file_to_decimal __P((char **, int, int, decimal_record *,
173 				enum decimal_string_form *, char **,
174 				FILE *, int *));
175 
176 extern char *seconvert __P((single *, int, int *, int *, char *));
177 extern char *sfconvert __P((single *, int, int *, int *, char *));
178 extern char *sgconvert __P((single *, int, int, char *));
179 extern char *econvert __P((double, int, int *, int *, char *));
180 extern char *fconvert __P((double, int, int *, int *, char *));
181 extern char *gconvert __P((double, int, int, char *));
182 extern char *qeconvert __P((quadruple *, int, int *, int *, char *));
183 extern char *qfconvert __P((quadruple *, int, int *, int *, char *));
184 extern char *qgconvert __P((quadruple *, int, int, char *));
185 
186 extern char *ecvt __P((double, int, int *, int *));
187 extern char *fcvt __P((double, int, int *, int *));
188 extern char *gcvt __P((double, int, char *));
189 
190 #if __cplusplus >= 199711L
191 namespace std {
192 #endif
193 /*
194  * ANSI C Standard says the following entry points should be
195  * prototyped in <stdlib.h>.  They are now, but weren't before.
196  */
197 extern double atof __P((const char *));
198 extern double strtod __P((const char *, char **));
199 #if __cplusplus >= 199711L
200 }
201 
202 using std::atof;
203 using std::strtod;
204 #endif /* end of namespace std */
205 
206 #ifdef __cplusplus
207 }
208 #endif
209 
210 #endif /* _FLOATINGPOINT_H */
211