2005-01-06 22:18:23 +00:00
|
|
|
/*-
|
1993-06-12 14:58:17 +00:00
|
|
|
* Copyright (c) 1989 Regents of the University of California.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
1993-10-16 14:40:57 +00:00
|
|
|
* from: @(#)float.h 7.1 (Berkeley) 5/8/90
|
1999-08-28 01:08:13 +00:00
|
|
|
* $FreeBSD$
|
1993-06-12 14:58:17 +00:00
|
|
|
*/
|
|
|
|
|
1993-11-07 17:43:17 +00:00
|
|
|
#ifndef _MACHINE_FLOAT_H_
|
|
|
|
#define _MACHINE_FLOAT_H_ 1
|
|
|
|
|
2004-04-25 02:36:29 +00:00
|
|
|
#include <sys/cdefs.h>
|
|
|
|
|
2004-07-19 08:17:25 +00:00
|
|
|
__BEGIN_DECLS
|
|
|
|
extern int __flt_rounds(void);
|
|
|
|
__END_DECLS
|
|
|
|
|
1993-06-12 14:58:17 +00:00
|
|
|
#define FLT_RADIX 2 /* b */
|
2004-07-19 08:17:25 +00:00
|
|
|
#define FLT_ROUNDS __flt_rounds()
|
2004-04-25 02:36:29 +00:00
|
|
|
#if __ISO_C_VISIBLE >= 1999
|
Implement fpclassify():
o Add a MD header private to libc called _fpmath.h; this header
contains bitfield layouts of MD floating-point types.
o Add a MI header private to libc called fpmath.h; this header
contains bitfield layouts of MI floating-point types.
o Add private libc variables to lib/libc/$arch/gen/infinity.c for
storing NaN values.
o Add __double_t and __float_t to <machine/_types.h>, and provide
double_t and float_t typedefs in <math.h>.
o Add some C99 manifest constants (FP_ILOGB0, FP_ILOGBNAN, HUGE_VALF,
HUGE_VALL, INFINITY, NAN, and return values for fpclassify()) to
<math.h> and others (FLT_EVAL_METHOD, DECIMAL_DIG) to <float.h> via
<machine/float.h>.
o Add C99 macro fpclassify() which calls __fpclassify{d,f,l}() based
on the size of its argument. __fpclassifyl() is never called on
alpha because (sizeof(long double) == sizeof(double)), which is good
since __fpclassifyl() can't deal with such a small `long double'.
This was developed by David Schultz and myself with input from bde and
fenner.
PR: 23103
Submitted by: David Schultz <dschultz@uclink.Berkeley.EDU>
(significant portions)
Reviewed by: bde, fenner (earlier versions)
2003-02-08 20:37:55 +00:00
|
|
|
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
|
|
|
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
2004-04-25 02:36:29 +00:00
|
|
|
#endif
|
1993-06-12 14:58:17 +00:00
|
|
|
|
|
|
|
#define FLT_MANT_DIG 24 /* p */
|
|
|
|
#define FLT_EPSILON 1.19209290E-07F /* b**(1-p) */
|
|
|
|
#define FLT_DIG 6 /* floor((p-1)*log10(b))+(b == 10) */
|
1993-06-30 22:59:18 +00:00
|
|
|
#define FLT_MIN_EXP (-125) /* emin */
|
1993-06-12 14:58:17 +00:00
|
|
|
#define FLT_MIN 1.17549435E-38F /* b**(emin-1) */
|
1993-06-30 22:59:18 +00:00
|
|
|
#define FLT_MIN_10_EXP (-37) /* ceil(log10(b**(emin-1))) */
|
1993-06-12 14:58:17 +00:00
|
|
|
#define FLT_MAX_EXP 128 /* emax */
|
|
|
|
#define FLT_MAX 3.40282347E+38F /* (1-b**(-p))*b**emax */
|
|
|
|
#define FLT_MAX_10_EXP 38 /* floor(log10((1-b**(-p))*b**emax)) */
|
|
|
|
|
|
|
|
#define DBL_MANT_DIG 53
|
|
|
|
#define DBL_EPSILON 2.2204460492503131E-16
|
|
|
|
#define DBL_DIG 15
|
1993-06-30 22:59:18 +00:00
|
|
|
#define DBL_MIN_EXP (-1021)
|
1993-06-29 13:34:33 +00:00
|
|
|
#define DBL_MIN 2.2250738585072014E-308
|
1993-06-30 22:59:18 +00:00
|
|
|
#define DBL_MIN_10_EXP (-307)
|
1993-06-12 14:58:17 +00:00
|
|
|
#define DBL_MAX_EXP 1024
|
1993-06-29 13:34:33 +00:00
|
|
|
#define DBL_MAX 1.7976931348623157E+308
|
1993-06-12 14:58:17 +00:00
|
|
|
#define DBL_MAX_10_EXP 308
|
|
|
|
|
Change float_t and double_t to long double on i386. All floating point
expressions on i386 are evaluated in the range of the long double type,
so this is wrong in a different but hopefully less worse way than
before. Since expressions are evaluated in long double registers,
there is no runtime cost to using long double instead of double to
declare intermediate values (except in cases where this avoids compiler
bugs), and by careful use of float_t or double_t it is possible to
avoid some of the compiler bugs in this area, provided these types are
declared as long double.
I was going to change float.h to be less broken and more usable in
combination with the change here (in particular, it is more necessary
to know the effective number of bits in a double_t when double_t !=
double, since DBL_MANT_DIG no longer logically gives this, and
LDBL_MANT_DIG doesn't give it either with FreeBSD-i386's default
rounding precision. However, this was too hard for now. In particular,
LDBL_MANT_DIG is used a lot in libm, so it cannot be changed. One
thing that is completely broken now is LDBL_MAX. This may have sort
of worked when it was changed from DBL_MAX in 2002 (adding 0 to it at
runtime gave +Inf, but you could at least compare with it), but starting
with gcc-3.3.1 in 2003, it is always +Inf due to evaluating it at
compile time in the default rounding precision.
2008-03-05 11:11:53 +00:00
|
|
|
#define LDBL_MANT_DIG DBL_MANT_DIG
|
|
|
|
#define LDBL_EPSILON DBL_EPSILON
|
2002-10-25 07:02:52 +00:00
|
|
|
#define LDBL_DIG 18
|
|
|
|
#define LDBL_MIN_EXP (-16381)
|
Change float_t and double_t to long double on i386. All floating point
expressions on i386 are evaluated in the range of the long double type,
so this is wrong in a different but hopefully less worse way than
before. Since expressions are evaluated in long double registers,
there is no runtime cost to using long double instead of double to
declare intermediate values (except in cases where this avoids compiler
bugs), and by careful use of float_t or double_t it is possible to
avoid some of the compiler bugs in this area, provided these types are
declared as long double.
I was going to change float.h to be less broken and more usable in
combination with the change here (in particular, it is more necessary
to know the effective number of bits in a double_t when double_t !=
double, since DBL_MANT_DIG no longer logically gives this, and
LDBL_MANT_DIG doesn't give it either with FreeBSD-i386's default
rounding precision. However, this was too hard for now. In particular,
LDBL_MANT_DIG is used a lot in libm, so it cannot be changed. One
thing that is completely broken now is LDBL_MAX. This may have sort
of worked when it was changed from DBL_MAX in 2002 (adding 0 to it at
runtime gave +Inf, but you could at least compare with it), but starting
with gcc-3.3.1 in 2003, it is always +Inf due to evaluating it at
compile time in the default rounding precision.
2008-03-05 11:11:53 +00:00
|
|
|
#define LDBL_MIN 3.36210314311209350626E-4932L
|
2002-10-25 07:02:52 +00:00
|
|
|
#define LDBL_MIN_10_EXP (-4931)
|
|
|
|
#define LDBL_MAX_EXP 16384
|
Change float_t and double_t to long double on i386. All floating point
expressions on i386 are evaluated in the range of the long double type,
so this is wrong in a different but hopefully less worse way than
before. Since expressions are evaluated in long double registers,
there is no runtime cost to using long double instead of double to
declare intermediate values (except in cases where this avoids compiler
bugs), and by careful use of float_t or double_t it is possible to
avoid some of the compiler bugs in this area, provided these types are
declared as long double.
I was going to change float.h to be less broken and more usable in
combination with the change here (in particular, it is more necessary
to know the effective number of bits in a double_t when double_t !=
double, since DBL_MANT_DIG no longer logically gives this, and
LDBL_MANT_DIG doesn't give it either with FreeBSD-i386's default
rounding precision. However, this was too hard for now. In particular,
LDBL_MANT_DIG is used a lot in libm, so it cannot be changed. One
thing that is completely broken now is LDBL_MAX. This may have sort
of worked when it was changed from DBL_MAX in 2002 (adding 0 to it at
runtime gave +Inf, but you could at least compare with it), but starting
with gcc-3.3.1 in 2003, it is always +Inf due to evaluating it at
compile time in the default rounding precision.
2008-03-05 11:11:53 +00:00
|
|
|
#define LDBL_MAX 1.18973149535723163300E+4932L
|
2002-10-25 07:02:52 +00:00
|
|
|
#define LDBL_MAX_10_EXP 4932
|
Change float_t and double_t to long double on i386. All floating point
expressions on i386 are evaluated in the range of the long double type,
so this is wrong in a different but hopefully less worse way than
before. Since expressions are evaluated in long double registers,
there is no runtime cost to using long double instead of double to
declare intermediate values (except in cases where this avoids compiler
bugs), and by careful use of float_t or double_t it is possible to
avoid some of the compiler bugs in this area, provided these types are
declared as long double.
I was going to change float.h to be less broken and more usable in
combination with the change here (in particular, it is more necessary
to know the effective number of bits in a double_t when double_t !=
double, since DBL_MANT_DIG no longer logically gives this, and
LDBL_MANT_DIG doesn't give it either with FreeBSD-i386's default
rounding precision. However, this was too hard for now. In particular,
LDBL_MANT_DIG is used a lot in libm, so it cannot be changed. One
thing that is completely broken now is LDBL_MAX. This may have sort
of worked when it was changed from DBL_MAX in 2002 (adding 0 to it at
runtime gave +Inf, but you could at least compare with it), but starting
with gcc-3.3.1 in 2003, it is always +Inf due to evaluating it at
compile time in the default rounding precision.
2008-03-05 11:11:53 +00:00
|
|
|
|
1993-11-07 17:43:17 +00:00
|
|
|
#endif /* _MACHINE_FLOAT_H_ */
|