diff options
author | Piotr Jasiukajtis <estibi@me.com> | 2014-02-04 20:31:57 +0100 |
---|---|---|
committer | Dan McDonald <danmcd@omniti.com> | 2014-10-17 18:00:52 -0400 |
commit | 25c28e83beb90e7c80452a7c818c5e6f73a07dc8 (patch) | |
tree | 95cb102e7fb37f52d4b3ec3e44508f352a335ee5 /usr/src/head/floatingpoint.h | |
parent | 4e6070e87069f63bef94d8e79c2fc3cab2c1ab6b (diff) | |
download | illumos-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.h | 212 |
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 */ |