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