summaryrefslogtreecommitdiff
path: root/usr/src/head/floatingpoint.h
diff options
context:
space:
mode:
authorPiotr Jasiukajtis <estibi@me.com>2014-02-04 20:31:57 +0100
committerDan McDonald <danmcd@omniti.com>2014-10-17 18:00:52 -0400
commit25c28e83beb90e7c80452a7c818c5e6f73a07dc8 (patch)
tree95cb102e7fb37f52d4b3ec3e44508f352a335ee5 /usr/src/head/floatingpoint.h
parent4e6070e87069f63bef94d8e79c2fc3cab2c1ab6b (diff)
downloadillumos-gate-25c28e83beb90e7c80452a7c818c5e6f73a07dc8.tar.gz
693 Opensource replacement of sunwlibm
Reviewed by: Igor Kozhukhov ikozhukhov@gmail.com Reviewed by: Keith M Wesolowski <keith.wesolowski@joyent.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Approved by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src/head/floatingpoint.h')
-rw-r--r--usr/src/head/floatingpoint.h212
1 files changed, 212 insertions, 0 deletions
diff --git a/usr/src/head/floatingpoint.h b/usr/src/head/floatingpoint.h
new file mode 100644
index 0000000000..c774303e65
--- /dev/null
+++ b/usr/src/head/floatingpoint.h
@@ -0,0 +1,212 @@
+/*
+ * 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 <stdio_tag.h>
+#endif
+#include <sys/ieeefp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * <floatingpoint.h> 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
+
+#define N_IEEE_EXCEPTION 5 /* Number of floating-point exceptions. */
+
+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, /* <digs> */
+ fixed_intdot_form, /* <digs>. */
+ fixed_dotfrac_form, /* .<digs> */
+ fixed_intdotfrac_form, /* <digs>.<frac> */
+ floating_int_form, /* <digs><exp> */
+ floating_intdot_form, /* <digs>.<exp> */
+ floating_dotfrac_form, /* .<digs><exp> */
+ floating_intdotfrac_form, /* <digs>.<digs><exp> */
+ 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 <stdlib.h>. 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 */