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 */