/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* Copyright (C) 1989 AT&T */ /* All Rights Reserved */ /* * Copyright 2011 Nexenta Systems, Inc. All rights reserved. */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _FLOATINGPOINT_H #define _FLOATINGPOINT_H #ifdef __STDC__ #include #endif #include #ifdef __cplusplus extern "C" { #endif /* * contains definitions for constants, types, variables, * and functions for: * IEEE floating-point arithmetic base conversion; * IEEE floating-point arithmetic modes; * IEEE floating-point arithmetic exception handling. */ #ifndef __P #ifdef __STDC__ #define __P(p) p #else #define __P(p) () #endif #endif /* !defined(__P) */ #if defined(__STDC__) && !defined(_FILEDEFED) #define _FILEDEFED typedef __FILE FILE; #endif typedef int sigfpe_code_type; /* Type of SIGFPE code. */ typedef void (*sigfpe_handler_type)(); /* Pointer to exception handler */ #define SIGFPE_DEFAULT (void (*)())0 /* default exception handling */ #define SIGFPE_IGNORE (void (*)())1 /* ignore this exception or code */ #define SIGFPE_ABORT (void (*)())2 /* force abort on exception */ extern sigfpe_handler_type sigfpe __P((sigfpe_code_type, sigfpe_handler_type)); /* * Types for IEEE floating point. */ typedef float single; #ifndef _EXTENDED #define _EXTENDED typedef unsigned extended[3]; #endif typedef long double quadruple; /* Quadruple-precision type. */ typedef unsigned fp_exception_field_type; /* * A field containing fp_exceptions OR'ed * together. */ /* * Definitions for base conversion. */ #define DECIMAL_STRING_LENGTH 512 /* Size of buffer in decimal_record. */ typedef char decimal_string[DECIMAL_STRING_LENGTH]; /* Decimal significand. */ typedef struct { enum fp_class_type fpclass; int sign; int exponent; decimal_string ds; /* Significand - each char contains an ascii */ /* digit, except the string-terminating */ /* ascii null. */ int more; /* On conversion from decimal to binary, != 0 */ /* indicates more non-zero digits following */ /* ds. */ int ndigits; /* On fixed_form conversion from binary to */ /* decimal, contains number of digits */ /* required for ds. */ } decimal_record; enum decimal_form { fixed_form, /* Fortran F format: ndigits specifies number */ /* of digits after point; if negative, */ /* specifies rounding to occur to left of */ /* point. */ floating_form /* Fortran E format: ndigits specifies number */ /* of significant digits. */ }; typedef struct { enum fp_direction_type rd; /* Rounding direction. */ enum decimal_form df; /* Format for conversion from binary to */ /* decimal. */ int ndigits; /* Number of digits for conversion. */ } decimal_mode; enum decimal_string_form { /* Valid decimal number string formats. */ invalid_form, /* Not a valid decimal string format. */ whitespace_form, /* All white space - valid in Fortran! */ fixed_int_form, /* */ fixed_intdot_form, /* . */ fixed_dotfrac_form, /* . */ fixed_intdotfrac_form, /* . */ floating_int_form, /* */ floating_intdot_form, /* . */ floating_dotfrac_form, /* . */ floating_intdotfrac_form, /* . */ inf_form, /* inf */ infinity_form, /* infinity */ nan_form, /* nan */ nanstring_form /* nan(string) */ }; extern void single_to_decimal __P((single *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void double_to_decimal __P((double *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void extended_to_decimal __P((extended *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void quadruple_to_decimal __P((quadruple *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void decimal_to_single __P((single *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void decimal_to_double __P((double *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void decimal_to_extended __P((extended *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void decimal_to_quadruple __P((quadruple *, decimal_mode *, decimal_record *, fp_exception_field_type *)); extern void string_to_decimal __P((char **, int, int, decimal_record *, enum decimal_string_form *, char **)); extern void func_to_decimal __P((char **, int, int, decimal_record *, enum decimal_string_form *, char **, int (*)(void), int *, int (*)(int))); extern void file_to_decimal __P((char **, int, int, decimal_record *, enum decimal_string_form *, char **, FILE *, int *)); extern char *seconvert __P((single *, int, int *, int *, char *)); extern char *sfconvert __P((single *, int, int *, int *, char *)); extern char *sgconvert __P((single *, int, int, char *)); extern char *econvert __P((double, int, int *, int *, char *)); extern char *fconvert __P((double, int, int *, int *, char *)); extern char *gconvert __P((double, int, int, char *)); extern char *qeconvert __P((quadruple *, int, int *, int *, char *)); extern char *qfconvert __P((quadruple *, int, int *, int *, char *)); extern char *qgconvert __P((quadruple *, int, int, char *)); extern char *ecvt __P((double, int, int *, int *)); extern char *fcvt __P((double, int, int *, int *)); extern char *gcvt __P((double, int, char *)); #if __cplusplus >= 199711L namespace std { #endif /* * ANSI C Standard says the following entry points should be * prototyped in . They are now, but weren't before. */ extern double atof __P((const char *)); extern double strtod __P((const char *, char **)); #if __cplusplus >= 199711L } using std::atof; using std::strtod; #endif /* end of namespace std */ #ifdef __cplusplus } #endif #endif /* _FLOATINGPOINT_H */