xref: /illumos-gate/usr/src/head/floatingpoint.h (revision 9938df9e)
125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis  * CDDL HEADER START
325c28e83SPiotr Jasiukajtis  *
425c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis  *
825c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis  * and limitations under the License.
1225c28e83SPiotr Jasiukajtis  *
1325c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis  *
1925c28e83SPiotr Jasiukajtis  * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis  */
2125c28e83SPiotr Jasiukajtis /*	Copyright (C) 1989 AT&T	*/
2225c28e83SPiotr Jasiukajtis /*	  All Rights Reserved */
2325c28e83SPiotr Jasiukajtis 
2425c28e83SPiotr Jasiukajtis /*
2525c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
2625c28e83SPiotr Jasiukajtis  */
2725c28e83SPiotr Jasiukajtis /*
2825c28e83SPiotr Jasiukajtis  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
2925c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
3025c28e83SPiotr Jasiukajtis  */
3125c28e83SPiotr Jasiukajtis 
3225c28e83SPiotr Jasiukajtis #ifndef _FLOATINGPOINT_H
3325c28e83SPiotr Jasiukajtis #define	_FLOATINGPOINT_H
3425c28e83SPiotr Jasiukajtis 
3525c28e83SPiotr Jasiukajtis #ifdef __STDC__
3625c28e83SPiotr Jasiukajtis #include <stdio_tag.h>
3725c28e83SPiotr Jasiukajtis #endif
3825c28e83SPiotr Jasiukajtis #include <sys/ieeefp.h>
3925c28e83SPiotr Jasiukajtis 
4025c28e83SPiotr Jasiukajtis #ifdef __cplusplus
4125c28e83SPiotr Jasiukajtis extern "C" {
4225c28e83SPiotr Jasiukajtis #endif
4325c28e83SPiotr Jasiukajtis 
4425c28e83SPiotr Jasiukajtis /*
4525c28e83SPiotr Jasiukajtis  * <floatingpoint.h> contains definitions for constants, types, variables,
4625c28e83SPiotr Jasiukajtis  * and functions for:
4725c28e83SPiotr Jasiukajtis  *	IEEE floating-point arithmetic base conversion;
4825c28e83SPiotr Jasiukajtis  *	IEEE floating-point arithmetic modes;
4925c28e83SPiotr Jasiukajtis  *	IEEE floating-point arithmetic exception handling.
5025c28e83SPiotr Jasiukajtis  */
5125c28e83SPiotr Jasiukajtis #if defined(__STDC__) && !defined(_FILEDEFED)
5225c28e83SPiotr Jasiukajtis #define	_FILEDEFED
5325c28e83SPiotr Jasiukajtis typedef	__FILE FILE;
5425c28e83SPiotr Jasiukajtis #endif
5525c28e83SPiotr Jasiukajtis 
5625c28e83SPiotr Jasiukajtis typedef int sigfpe_code_type;	/* Type of SIGFPE code. */
5725c28e83SPiotr Jasiukajtis 
5825c28e83SPiotr Jasiukajtis typedef void (*sigfpe_handler_type)();	/* Pointer to exception handler */
5925c28e83SPiotr Jasiukajtis 
6025c28e83SPiotr Jasiukajtis #define	SIGFPE_DEFAULT (void (*)())0	/* default exception handling */
616e270ca8SMarcel Telka #define	SIGFPE_IGNORE  (void (*)())1	/* ignore this exception or code */
626e270ca8SMarcel Telka #define	SIGFPE_ABORT   (void (*)())2	/* force abort on exception */
6325c28e83SPiotr Jasiukajtis 
64*9938df9eSRichard Lowe extern sigfpe_handler_type sigfpe(sigfpe_code_type, sigfpe_handler_type);
6525c28e83SPiotr Jasiukajtis 
6625c28e83SPiotr Jasiukajtis /*
6725c28e83SPiotr Jasiukajtis  * Types for IEEE floating point.
6825c28e83SPiotr Jasiukajtis  */
6925c28e83SPiotr Jasiukajtis typedef float single;
7025c28e83SPiotr Jasiukajtis 
7125c28e83SPiotr Jasiukajtis #ifndef _EXTENDED
7225c28e83SPiotr Jasiukajtis #define	_EXTENDED
7325c28e83SPiotr Jasiukajtis typedef unsigned extended[3];
7425c28e83SPiotr Jasiukajtis #endif
7525c28e83SPiotr Jasiukajtis 
7625c28e83SPiotr Jasiukajtis typedef long double quadruple;	/* Quadruple-precision type. */
7725c28e83SPiotr Jasiukajtis 
7825c28e83SPiotr Jasiukajtis typedef unsigned fp_exception_field_type;
7925c28e83SPiotr Jasiukajtis 				/*
8025c28e83SPiotr Jasiukajtis 				 * A field containing fp_exceptions OR'ed
8125c28e83SPiotr Jasiukajtis 				 * together.
8225c28e83SPiotr Jasiukajtis 				 */
8325c28e83SPiotr Jasiukajtis /*
8425c28e83SPiotr Jasiukajtis  * Definitions for base conversion.
8525c28e83SPiotr Jasiukajtis  */
8625c28e83SPiotr Jasiukajtis #define	DECIMAL_STRING_LENGTH 512	/* Size of buffer in decimal_record. */
8725c28e83SPiotr Jasiukajtis 
8825c28e83SPiotr Jasiukajtis typedef char decimal_string[DECIMAL_STRING_LENGTH];
8925c28e83SPiotr Jasiukajtis 				/* Decimal significand. */
9025c28e83SPiotr Jasiukajtis 
9125c28e83SPiotr Jasiukajtis typedef struct {
9225c28e83SPiotr Jasiukajtis 	enum fp_class_type fpclass;
9325c28e83SPiotr Jasiukajtis 	int	sign;
9425c28e83SPiotr Jasiukajtis 	int	exponent;
9525c28e83SPiotr Jasiukajtis 	decimal_string ds;	/* Significand - each char contains an ascii */
9625c28e83SPiotr Jasiukajtis 				/* digit, except the string-terminating */
9725c28e83SPiotr Jasiukajtis 				/* ascii null. */
9825c28e83SPiotr Jasiukajtis 	int	more;		/* On conversion from decimal to binary, != 0 */
9925c28e83SPiotr Jasiukajtis 				/* indicates more non-zero digits following */
10025c28e83SPiotr Jasiukajtis 				/* ds. */
1016e270ca8SMarcel Telka 	int	ndigits;	/* On fixed_form conversion from binary to */
10225c28e83SPiotr Jasiukajtis 				/* decimal, contains number of digits */
10325c28e83SPiotr Jasiukajtis 				/* required for ds. */
10425c28e83SPiotr Jasiukajtis } decimal_record;
10525c28e83SPiotr Jasiukajtis 
10625c28e83SPiotr Jasiukajtis enum decimal_form {
10725c28e83SPiotr Jasiukajtis 	fixed_form,		/* Fortran F format: ndigits specifies number */
10825c28e83SPiotr Jasiukajtis 				/* of digits after point; if negative, */
10925c28e83SPiotr Jasiukajtis 				/* specifies rounding to occur to left of */
11025c28e83SPiotr Jasiukajtis 				/* point. */
11125c28e83SPiotr Jasiukajtis 	floating_form		/* Fortran E format: ndigits specifies number */
11225c28e83SPiotr Jasiukajtis 				/* of significant digits. */
11325c28e83SPiotr Jasiukajtis };
11425c28e83SPiotr Jasiukajtis 
11525c28e83SPiotr Jasiukajtis typedef struct {
11625c28e83SPiotr Jasiukajtis 	enum fp_direction_type rd;
11725c28e83SPiotr Jasiukajtis 				/* Rounding direction. */
11825c28e83SPiotr Jasiukajtis 	enum decimal_form df;	/* Format for conversion from binary to */
11925c28e83SPiotr Jasiukajtis 				/* decimal. */
12025c28e83SPiotr Jasiukajtis 	int ndigits;		/* Number of digits for conversion. */
12125c28e83SPiotr Jasiukajtis } decimal_mode;
12225c28e83SPiotr Jasiukajtis 
12325c28e83SPiotr Jasiukajtis enum decimal_string_form {	/* Valid decimal number string formats. */
12425c28e83SPiotr Jasiukajtis 	invalid_form,		/* Not a valid decimal string format. */
12525c28e83SPiotr Jasiukajtis 	whitespace_form,	/* All white space - valid in Fortran! */
1266e270ca8SMarcel Telka 	fixed_int_form,		/* <digs>		*/
1276e270ca8SMarcel Telka 	fixed_intdot_form,	/* <digs>.		*/
12825c28e83SPiotr Jasiukajtis 	fixed_dotfrac_form,	/* .<digs>		*/
12925c28e83SPiotr Jasiukajtis 	fixed_intdotfrac_form,	/* <digs>.<frac>	*/
13025c28e83SPiotr Jasiukajtis 	floating_int_form,	/* <digs><exp>		*/
13125c28e83SPiotr Jasiukajtis 	floating_intdot_form,	/* <digs>.<exp>		*/
13225c28e83SPiotr Jasiukajtis 	floating_dotfrac_form,	/* .<digs><exp>		*/
13325c28e83SPiotr Jasiukajtis 	floating_intdotfrac_form, /* <digs>.<digs><exp>	*/
13425c28e83SPiotr Jasiukajtis 	inf_form,		/* inf			*/
13525c28e83SPiotr Jasiukajtis 	infinity_form,		/* infinity		*/
13625c28e83SPiotr Jasiukajtis 	nan_form,		/* nan			*/
13725c28e83SPiotr Jasiukajtis 	nanstring_form		/* nan(string)		*/
13825c28e83SPiotr Jasiukajtis };
13925c28e83SPiotr Jasiukajtis 
140*9938df9eSRichard Lowe extern void single_to_decimal(single *, decimal_mode *, decimal_record *,
141*9938df9eSRichard Lowe     fp_exception_field_type *);
142*9938df9eSRichard Lowe extern void double_to_decimal(double *, decimal_mode *, decimal_record *,
143*9938df9eSRichard Lowe     fp_exception_field_type *);
144*9938df9eSRichard Lowe extern void extended_to_decimal(extended *, decimal_mode *,
145*9938df9eSRichard Lowe     decimal_record *, fp_exception_field_type *);
146*9938df9eSRichard Lowe extern void quadruple_to_decimal(quadruple *, decimal_mode *,
147*9938df9eSRichard Lowe     decimal_record *, fp_exception_field_type *);
148*9938df9eSRichard Lowe 
149*9938df9eSRichard Lowe extern void decimal_to_single(single *, decimal_mode *, decimal_record *,
150*9938df9eSRichard Lowe     fp_exception_field_type *);
151*9938df9eSRichard Lowe extern void decimal_to_double(double *, decimal_mode *, decimal_record *,
152*9938df9eSRichard Lowe     fp_exception_field_type *);
153*9938df9eSRichard Lowe extern void decimal_to_extended(extended *, decimal_mode *,
154*9938df9eSRichard Lowe     decimal_record *, fp_exception_field_type *);
155*9938df9eSRichard Lowe extern void decimal_to_quadruple(quadruple *, decimal_mode *,
156*9938df9eSRichard Lowe     decimal_record *, fp_exception_field_type *);
157*9938df9eSRichard Lowe 
158*9938df9eSRichard Lowe extern void string_to_decimal(char **, int, int, decimal_record *,
159*9938df9eSRichard Lowe     enum decimal_string_form *, char **);
160*9938df9eSRichard Lowe extern void func_to_decimal(char **, int, int, decimal_record *,
161*9938df9eSRichard Lowe     enum decimal_string_form *, char **,
162*9938df9eSRichard Lowe     int (*)(void), int *, int (*)(int));
163*9938df9eSRichard Lowe extern void file_to_decimal(char **, int, int, decimal_record *,
164*9938df9eSRichard Lowe     enum decimal_string_form *, char **,
165*9938df9eSRichard Lowe     FILE *, int *);
166*9938df9eSRichard Lowe 
167*9938df9eSRichard Lowe extern char *seconvert(single *, int, int *, int *, char *);
168*9938df9eSRichard Lowe extern char *sfconvert(single *, int, int *, int *, char *);
169*9938df9eSRichard Lowe extern char *sgconvert(single *, int, int, char *);
170*9938df9eSRichard Lowe extern char *econvert(double, int, int *, int *, char *);
171*9938df9eSRichard Lowe extern char *fconvert(double, int, int *, int *, char *);
172*9938df9eSRichard Lowe extern char *gconvert(double, int, int, char *);
173*9938df9eSRichard Lowe extern char *qeconvert(quadruple *, int, int *, int *, char *);
174*9938df9eSRichard Lowe extern char *qfconvert(quadruple *, int, int *, int *, char *);
175*9938df9eSRichard Lowe extern char *qgconvert(quadruple *, int, int, char *);
176*9938df9eSRichard Lowe 
177*9938df9eSRichard Lowe extern char *ecvt(double, int, int *, int *);
178*9938df9eSRichard Lowe extern char *fcvt(double, int, int *, int *);
179*9938df9eSRichard Lowe extern char *gcvt(double, int, char *);
18025c28e83SPiotr Jasiukajtis 
18125c28e83SPiotr Jasiukajtis #if __cplusplus >= 199711L
18225c28e83SPiotr Jasiukajtis namespace std {
18325c28e83SPiotr Jasiukajtis #endif
18425c28e83SPiotr Jasiukajtis /*
18525c28e83SPiotr Jasiukajtis  * ANSI C Standard says the following entry points should be
18625c28e83SPiotr Jasiukajtis  * prototyped in <stdlib.h>.  They are now, but weren't before.
18725c28e83SPiotr Jasiukajtis  */
188*9938df9eSRichard Lowe extern double atof(const char *);
189*9938df9eSRichard Lowe extern double strtod(const char *, char **);
19025c28e83SPiotr Jasiukajtis #if __cplusplus >= 199711L
19125c28e83SPiotr Jasiukajtis }
19225c28e83SPiotr Jasiukajtis 
19325c28e83SPiotr Jasiukajtis using std::atof;
19425c28e83SPiotr Jasiukajtis using std::strtod;
19525c28e83SPiotr Jasiukajtis #endif /* end of namespace std */
19625c28e83SPiotr Jasiukajtis 
19725c28e83SPiotr Jasiukajtis #ifdef __cplusplus
19825c28e83SPiotr Jasiukajtis }
19925c28e83SPiotr Jasiukajtis #endif
20025c28e83SPiotr Jasiukajtis 
20125c28e83SPiotr Jasiukajtis #endif /* _FLOATINGPOINT_H */
202