You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
5.4 KiB

5 years ago
/* float.h: ANSI 'C' (X3J11 Oct 88) library header, section 2.2.4.2 */
/* Copyright (C) Codemist Ltd, 1988 */
/* Copyright 1991 ARM Limited. All rights reserved. */
/* version 0.01 */
/*
* RCS $Revision: 177844 $
* Checkin $Date: 2012-11-21 11:51:12 +0000 (Wed, 21 Nov 2012) $
* Revising $Author: drodgman $
*/
#ifndef __float_h
#define __float_h
#define __ARMCLIB_VERSION 5050106
#ifndef __FLOAT_DECLS
#define __FLOAT_DECLS
#undef __CLIBNS
#ifdef __cplusplus
namespace std {
#define __CLIBNS std::
extern "C" {
#else
#define __CLIBNS
#endif /* __cplusplus */
/* IEEE version: the following values are taken from the above ANSI draft. */
/* The ACORN FPE (v17) is known not to precisely implement IEEE arithmetic. */
#define FLT_RADIX 2
/* radix of exponent representation */
#ifdef __FP_FENV_ROUNDING
extern unsigned __ieee_status(unsigned,unsigned); /* from fenv.h */
#define FLT_ROUNDS ((1+(__CLIBNS __ieee_status(0, 0)>>22))&3)
#else
#define FLT_ROUNDS 1
#endif
/*
* The rounding mode for floating-point addition is characterised by the
* value of FLT_ROUNDS:
* -1 : indeterminable.
* 0 : towards zero.
* 1 : to nearest.
* 2 : towards positive infinity.
* 3 : towards negative infinity.
* ? : any other is implementation-defined.
*/
#define FLT_MANT_DIG 24
#define DBL_MANT_DIG 53
#define LDBL_MANT_DIG 53
/* number of base-FLT_RADIX digits in the floating point mantissa */
#if !defined(__STRICT_ANSI__) || (defined(__STDC_VERSION__) && 199901L <= __STDC_VERSION__)
#define DECIMAL_DIG 17
/* number of decimal digits that the widest floating point type
can be rounded to and back again without changing the value */
#ifdef __FP_FAST
# define FLT_EVAL_METHOD (-1)
#else
# define FLT_EVAL_METHOD 0
#endif
/*
* The use of evaluation formats is characterized by the value of
* FLT_EVAL_METHOD:
* -1 : indeterminable.
* 0 : evaluate all operations and constants just to the range
* and precision of the type.
* 1 : evaluate operations and constants of type float and
* double to the range and precision of the double type,
* evaluate long double operations and constants to the
* range and precision of the long double type.
* 2 : evaluate all opertations and constants to the range and
* precision of the long double type.
*/
#endif
/* The values that follow are not achieved under Acorn's FPE version 17 */
/* but they should be correct in due course! */
#define FLT_DIG 6
#define DBL_DIG 15
#define LDBL_DIG 15
/* number of decimal digits of precision */
#define FLT_MIN_EXP (-125)
#define DBL_MIN_EXP (-1021)
#define LDBL_MIN_EXP (-1021)
/* minimum negative integer such that FLT_RADIX raised to that power */
/* minus 1 is a normalised floating-point number. */
#define FLT_MIN_10_EXP (-37)
#define DBL_MIN_10_EXP (-307)
#define LDBL_MIN_10_EXP (-307)
/* minimum negative integer such that 10 raised to that power is in the */
/* range of normalised floating-point numbers. */
#define FLT_MAX_EXP 128
#define DBL_MAX_EXP 1024
#define LDBL_MAX_EXP 1024
/* maximum integer such that FLT_RADIX raised to that power minus 1 is a */
#define FLT_MAX_10_EXP 38
#define DBL_MAX_10_EXP 308
#define LDBL_MAX_10_EXP 308
/* maximum integer such that 10 raised to that power is in the range of */
/* representable finite floating-point numbers. */
#define FLT_MAX 3.40282347e+38F
#define DBL_MAX 1.79769313486231571e+308
#define LDBL_MAX 1.79769313486231571e+308L
/* maximum representable finite floating-point number. */
#define FLT_EPSILON 1.19209290e-7F
#define DBL_EPSILON 2.2204460492503131e-16
#define LDBL_EPSILON 2.2204460492503131e-16L
/* minimum positive floating point number x such that 1.0 + x != 1.0 */
#define FLT_MIN 1.175494351e-38F
#define DBL_MIN 2.22507385850720138e-308
#define LDBL_MIN 2.22507385850720138e-308L
/* minimum normalised positive floating-point number. */
/*
* The Microsoft <float.h> extensions.
*/
#ifdef __cplusplus
extern "C" {
#endif
unsigned _controlfp(unsigned, unsigned);
unsigned _clearfp(void);
unsigned _statusfp(void);
#ifdef __cplusplus
}
#endif
/*
* Because the _EM_ constants are shared between _controlfp (masks)
* and _statusfp (sticky bits), we adopt the convention that
* _controlfp will shift its arguments left by 8 bits before using
* them.
*/
#define _MCW_EM 0x001F
#define _EM_INVALID 0x0001
#define _EM_ZERODIVIDE 0x0002
#define _EM_OVERFLOW 0x0004
#define _EM_UNDERFLOW 0x0008
#define _EM_INEXACT 0x0010
#define _MCW_RC 0xC000
#define _RC_CHOP 0xC000
#define _RC_UP 0x4000
#define _RC_DOWN 0x8000
#define _RC_NEAR 0x0000
/*
* _FPE_ constants passed as the hidden second argument to SIGFPE
* handlers.
*/
#define _FPE_INVALID 0x04000000
#define _FPE_ZERODIVIDE 0x08000000
#define _FPE_OVERFLOW 0x10000000
#define _FPE_UNDERFLOW 0x20000000
#define _FPE_INEXACT 0x40000000
#ifdef __cplusplus
} /* extern "C" */
} /* namespace std */
#endif
#endif /* __FLOAT_DECLS */
#if defined(__cplusplus) && !defined(__FLOAT_NO_EXPORTS)
using ::std::_controlfp;
using ::std::_clearfp;
using ::std::_statusfp;
#endif
#endif /* __float_h */
/* end of float.h */