mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-22 15:07:43 +08:00
8f2bd6f046
Correct the overflow limit in the variable o_threshold to be consistent with the FLT_UWORD_LOG_MAX variable used by the internal implementation of the expf algorithm itself. The u_threshold variable has also been modified to be written in the same format. Note that this fix improves the situation but does not completely correct the inconsistencies regarding the overflow and underflow limits between the expf wrapper (wf_exp.c) and the expf algorithm itself (ef_exp.c). Currently these limits are different for the _FLT_LARGEST_EXPONENT_IS_NORMAL and _FLT_NO_DENORMALS cases as well as for the case where __OBSOLETE_MATH is not defined (only for the underflow limit in this case).
74 lines
1.4 KiB
C
74 lines
1.4 KiB
C
/* wf_exp.c -- float version of w_exp.c.
|
|
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
|
|
*/
|
|
|
|
/*
|
|
* ====================================================
|
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
|
*
|
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
|
* Permission to use, copy, modify, and distribute this
|
|
* software is freely granted, provided that this notice
|
|
* is preserved.
|
|
* ====================================================
|
|
*/
|
|
|
|
/*
|
|
* wrapper expf(x)
|
|
*/
|
|
|
|
#include "fdlibm.h"
|
|
#if __OBSOLETE_MATH
|
|
#include <errno.h>
|
|
|
|
#ifdef __STDC__
|
|
static const float
|
|
#else
|
|
static float
|
|
#endif
|
|
o_threshold= 0x1.62e42ep+06, /* 0x42b17217 */
|
|
u_threshold= -0x1.9fe36ap+06; /* 0xc2cff1b5 */
|
|
|
|
#ifdef __STDC__
|
|
float expf(float x) /* wrapper expf */
|
|
#else
|
|
float expf(x) /* wrapper expf */
|
|
float x;
|
|
#endif
|
|
{
|
|
#ifdef _IEEE_LIBM
|
|
return __ieee754_expf(x);
|
|
#else
|
|
float z;
|
|
z = __ieee754_expf(x);
|
|
if(_LIB_VERSION == _IEEE_) return z;
|
|
if(finitef(x)) {
|
|
if(x>o_threshold) {
|
|
/* expf(finite) overflow */
|
|
errno = ERANGE;
|
|
return HUGE_VALF;
|
|
} else if(x<u_threshold) {
|
|
/* expf(finite) underflow */
|
|
errno = ERANGE;
|
|
return 0.0f;
|
|
}
|
|
}
|
|
return z;
|
|
#endif
|
|
}
|
|
|
|
#ifdef _DOUBLE_IS_32BITS
|
|
|
|
#ifdef __STDC__
|
|
double exp(double x)
|
|
#else
|
|
double exp(x)
|
|
double x;
|
|
#endif
|
|
{
|
|
return (double) expf((float) x);
|
|
}
|
|
|
|
#endif /* defined(_DOUBLE_IS_32BITS) */
|
|
#endif /* __OBSOLETE_MATH */
|