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 #define N_IEEE_EXCEPTION 5      /* Number of floating-point exceptions. */
  66 
  67 typedef int sigfpe_code_type;   /* Type of SIGFPE code. */
  68 
  69 typedef void (*sigfpe_handler_type)();  /* Pointer to exception handler */
  70 
  71 #define SIGFPE_DEFAULT (void (*)())0    /* default exception handling */
  72 #define SIGFPE_IGNORE  (void (*)())1    /* ignore this exception or code */
  73 #define SIGFPE_ABORT   (void (*)())2    /* force abort on exception */
  74 
  75 extern sigfpe_handler_type sigfpe __P((sigfpe_code_type, sigfpe_handler_type));
  76 
  77 /*
  78  * Types for IEEE floating point.
  79  */
  80 typedef float single;
  81 
  82 #ifndef _EXTENDED
  83 #define _EXTENDED
  84 typedef unsigned extended[3];
  85 #endif
  86 
  87 typedef long double quadruple;  /* Quadruple-precision type. */
  88 
  89 typedef unsigned fp_exception_field_type;
  90                                 /*
  91                                  * A field containing fp_exceptions OR'ed
  92                                  * together.
  93                                  */
  94 /*
  95  * Definitions for base conversion.
  96  */
  97 #define DECIMAL_STRING_LENGTH 512       /* Size of buffer in decimal_record. */
  98 
  99 typedef char decimal_string[DECIMAL_STRING_LENGTH];
 100                                 /* Decimal significand. */
 101 
 102 typedef struct {
 103         enum fp_class_type fpclass;
 104         int     sign;
 105         int     exponent;
 106         decimal_string ds;      /* Significand - each char contains an ascii */
 107                                 /* digit, except the string-terminating */
 108                                 /* ascii null. */
 109         int     more;           /* On conversion from decimal to binary, != 0 */
 110                                 /* indicates more non-zero digits following */
 111                                 /* ds. */
 112         int     ndigits;        /* On fixed_form conversion from binary to */
 113                                 /* decimal, contains number of digits */
 114                                 /* required for ds. */
 115 } decimal_record;
 116 
 117 enum decimal_form {
 118         fixed_form,             /* Fortran F format: ndigits specifies number */
 119                                 /* of digits after point; if negative, */
 120                                 /* specifies rounding to occur to left of */
 121                                 /* point. */
 122         floating_form           /* Fortran E format: ndigits specifies number */
 123                                 /* of significant digits. */
 124 };
 125 
 126 typedef struct {
 127         enum fp_direction_type rd;
 128                                 /* Rounding direction. */
 129         enum decimal_form df;   /* Format for conversion from binary to */
 130                                 /* decimal. */
 131         int ndigits;            /* Number of digits for conversion. */
 132 } decimal_mode;
 133 
 134 enum decimal_string_form {      /* Valid decimal number string formats. */
 135         invalid_form,           /* Not a valid decimal string format. */
 136         whitespace_form,        /* All white space - valid in Fortran! */
 137         fixed_int_form,         /* <digs>         */
 138         fixed_intdot_form,      /* <digs>.                */
 139         fixed_dotfrac_form,     /* .<digs>                */
 140         fixed_intdotfrac_form,  /* <digs>.<frac>    */
 141         floating_int_form,      /* <digs><exp>              */
 142         floating_intdot_form,   /* <digs>.<exp>             */
 143         floating_dotfrac_form,  /* .<digs><exp>             */
 144         floating_intdotfrac_form, /* <digs>.<digs><exp>       */
 145         inf_form,               /* inf                  */
 146         infinity_form,          /* infinity             */
 147         nan_form,               /* nan                  */
 148         nanstring_form          /* nan(string)          */
 149 };
 150 
 151 extern void single_to_decimal __P((single *, decimal_mode *, decimal_record *,
 152                                 fp_exception_field_type *));
 153 extern void double_to_decimal __P((double *, decimal_mode *, decimal_record *,
 154                                 fp_exception_field_type *));
 155 extern void extended_to_decimal __P((extended *, decimal_mode *,
 156                                 decimal_record *, fp_exception_field_type *));
 157 extern void quadruple_to_decimal __P((quadruple *, decimal_mode *,
 158                                 decimal_record *, fp_exception_field_type *));
 159 
 160 extern void decimal_to_single __P((single *, decimal_mode *, decimal_record *,
 161                                 fp_exception_field_type *));
 162 extern void decimal_to_double __P((double *, decimal_mode *, decimal_record *,
 163                                 fp_exception_field_type *));
 164 extern void decimal_to_extended __P((extended *, decimal_mode *,
 165                                 decimal_record *, fp_exception_field_type *));
 166 extern void decimal_to_quadruple __P((quadruple *, decimal_mode *,
 167                                 decimal_record *, fp_exception_field_type *));
 168 
 169 extern void string_to_decimal __P((char **, int, int, decimal_record *,
 170                                 enum decimal_string_form *, char **));
 171 extern void func_to_decimal __P((char **, int, int, decimal_record *,
 172                                 enum decimal_string_form *, char **,
 173                                 int (*)(void), int *, int (*)(int)));
 174 extern void file_to_decimal __P((char **, int, int, decimal_record *,
 175                                 enum decimal_string_form *, char **,
 176                                 FILE *, int *));
 177 
 178 extern char *seconvert __P((single *, int, int *, int *, char *));
 179 extern char *sfconvert __P((single *, int, int *, int *, char *));
 180 extern char *sgconvert __P((single *, int, int, char *));
 181 extern char *econvert __P((double, int, int *, int *, char *));
 182 extern char *fconvert __P((double, int, int *, int *, char *));
 183 extern char *gconvert __P((double, int, int, char *));
 184 extern char *qeconvert __P((quadruple *, int, int *, int *, char *));
 185 extern char *qfconvert __P((quadruple *, int, int *, int *, char *));
 186 extern char *qgconvert __P((quadruple *, int, int, char *));
 187 
 188 extern char *ecvt __P((double, int, int *, int *));
 189 extern char *fcvt __P((double, int, int *, int *));
 190 extern char *gcvt __P((double, int, char *));
 191 
 192 #if __cplusplus >= 199711L
 193 namespace std {
 194 #endif
 195 /*
 196  * ANSI C Standard says the following entry points should be
 197  * prototyped in <stdlib.h>.  They are now, but weren't before.
 198  */
 199 extern double atof __P((const char *));
 200 extern double strtod __P((const char *, char **));
 201 #if __cplusplus >= 199711L
 202 }
 203 
 204 using std::atof;
 205 using std::strtod;
 206 #endif /* end of namespace std */
 207 
 208 #ifdef __cplusplus
 209 }
 210 #endif
 211 
 212 #endif /* _FLOATINGPOINT_H */