diff options
Diffstat (limited to 'libm/fpmacros.c')
-rw-r--r-- | libm/fpmacros.c | 303 |
1 files changed, 0 insertions, 303 deletions
diff --git a/libm/fpmacros.c b/libm/fpmacros.c deleted file mode 100644 index 0a079c016..000000000 --- a/libm/fpmacros.c +++ /dev/null @@ -1,303 +0,0 @@ -/*********************************************************************** -** File: fpmacros.c -** -** Contains: C source code for implementations of floating-point -** functions which involve float format numbers, as -** defined in header <fp.h>. In particular, this file -** contains implementations of functions -** __fpclassify(d,f), __isnormal(d,f), __isfinite(d,f), -** __isnan(d,f), and __signbit(d,f). This file targets -** PowerPC platforms. -** -** Written by: Robert A. Murley, Ali Sazegari -** -** Copyright: c 2001 by Apple Computer, Inc., all rights reserved -** -** Change History (most recent first): -** -** 07 Jul 01 ram First created from fpfloatfunc.c, fp.c, -** classify.c and sign.c in MathLib v3 Mac OS9. -** -***********************************************************************/ - -#include <features.h> -#include <sys/types.h> -#include <math.h> -#include "fp_private.h" - -#define SIGN_MASK 0x80000000 -#define NSIGN_MASK 0x7fffffff -#define FEXP_MASK 0x7f800000 -#define FFRAC_MASK 0x007fffff - -/*********************************************************************** - int __fpclassifyf(float x) returns the classification code of the - argument x, as defined in <fp.h>. - - Exceptions: INVALID signaled if x is a signaling NaN; in this case, - the FP_QNAN code is returned. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__fpclassifyf) -int __fpclassifyf ( float x ) -{ - unsigned int iexp; - - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - iexp = z.lval & FEXP_MASK; /* isolate float exponent */ - - if (iexp == FEXP_MASK) { /* NaN or INF case */ - if ((z.lval & 0x007fffff) == 0) - return FP_INFINITE; - return FP_NAN; - } - - if (iexp != 0) /* normal float */ - return FP_NORMAL; - - if (x == 0.0) - return FP_ZERO; /* zero */ - else - return FP_SUBNORMAL; /* must be subnormal */ -} -libm_hidden_def(__fpclassifyf) - - -/*********************************************************************** - Function __fpclassify, - Implementation of classify of a double number for the PowerPC. - - Exceptions: INVALID signaled if x is a signaling NaN; in this case, - the FP_QNAN code is returned. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__fpclassify) -int __fpclassify ( double arg ) -{ - register unsigned int exponent; - union - { - dHexParts hex; - double dbl; - } x; - - x.dbl = arg; - - exponent = x.hex.high & dExpMask; - if ( exponent == dExpMask ) - { - if ( ( ( x.hex.high & dHighMan ) | x.hex.low ) == 0 ) - return FP_INFINITE; - else - return FP_NAN; - } - else if ( exponent != 0) - return FP_NORMAL; - else { - if ( arg == 0.0 ) - return FP_ZERO; - else - return FP_SUBNORMAL; - } -} -libm_hidden_def(__fpclassify) - - -/*********************************************************************** - int __isnormalf(float x) returns nonzero if and only if x is a - normalized float number and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN; in this case, - zero is returned. - - Calls: none -***********************************************************************/ - -int __isnormalf ( float x ); -int __isnormalf ( float x ) -{ - unsigned int iexp; - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - iexp = z.lval & FEXP_MASK; /* isolate float exponent */ - return ((iexp != FEXP_MASK) && (iexp != 0)); -} - - -int __isnormal ( double x ); -int __isnormal ( double x ) -{ - return ( __fpclassify ( x ) == FP_NORMAL ); -} - - -/*********************************************************************** - int __isfinitef(float x) returns nonzero if and only if x is a - finite (normal, subnormal, or zero) float number and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN; in this case, - zero is returned. - - Calls: none -***********************************************************************/ - -int __finitef ( float x ) -{ - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - return ((z.lval & FEXP_MASK) != FEXP_MASK); -} -strong_alias(__finitef,finitef) - -#if 0 /* use __finite in s_finite.c */ -int __finite ( double x ) -{ - return ( __fpclassify ( x ) >= FP_ZERO ); -} -strong_alias(__finite,finite) -#endif - - -/*********************************************************************** - int __signbitf(float x) returns nonzero if and only if the sign - bit of x is set and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__signbitf) -int __signbitf ( float x ) -{ - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - return ((z.lval & SIGN_MASK) != 0); -} -libm_hidden_def(__signbitf) - - -/*********************************************************************** - Function sign of a double. - Implementation of sign bit for the PowerPC. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__signbit) -int __signbit ( double arg ) -{ - union - { - dHexParts hex; - double dbl; - } x; - int sign; - - x.dbl = arg; - sign = ( ( x.hex.high & dSgnMask ) == dSgnMask ) ? 1 : 0; - return sign; -} -libm_hidden_def(__signbit) - - -/*********************************************************************** -* int __isinff(float x) returns -1 if value represents negative -* infinity, 1 if value represents positive infinity, -* and 0 otherwise. -* -* Calls: __signbit -* +***********************************************************************/ -int __isinff ( float x ) -{ - int class = __fpclassifyf(x); - if ( class == FP_INFINITE ) { - return ( (__signbitf(x)) ? -1 : 1); - } - return 0; -} -strong_alias(__isinff,isinff) - -int __isinf ( double x ) -{ - int class = __fpclassify(x); - if ( class == FP_INFINITE ) { - return ( (__signbit(x)) ? -1 : 1); - } - return 0; -} -strong_alias(__isinf,isinf) - -#if 0 -int __isinfl ( long double x ) -{ - int class = __fpclassify(x); - if ( class == FP_INFINITE ) { - return ( (__signbit(x)) ? -1 : 1); - } - return 0; -} -strong_alias(__isinfl,isinfl) -#endif - -/*********************************************************************** - int __isnanf(float x) returns nonzero if and only if x is a - NaN and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN; in this case, - nonzero is returned. - - Calls: none -***********************************************************************/ - -int __isnanf ( float x ) -{ - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - return (((z.lval&FEXP_MASK) == FEXP_MASK) && ((z.lval&FFRAC_MASK) != 0)); -} -strong_alias(__isnanf,isnanf) - -libm_hidden_proto(__isnan) -int __isnan ( double x ) -{ - int class = __fpclassify(x); - return ( class == FP_NAN ); -} -libm_hidden_def(__isnan) -strong_alias(__isnan,isnan) - -#if 0 -int __isnanl ( long double x ) -{ - int class = __fpclassify(x); - return ( class == FP_NAN ); -} -strong_alias(__isnanl,isnanl) -#endif - |