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