mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-18 02:50:09 +00:00
6bc31da01b
Wed Jan 1 15:15:00 1997 Ulrich Drepper <drepper@cygnus.com> * libio/Makefile (routines): Add fcloseall. * libio/fcloseall.c: New file. * libio/stdio.h [__USE_GNU]: Add prototype for fcloseall. * libio/iofclose.c: Don't close all streams when argument is NULL. * stdio/Makefile (routines): Add fcloseall. * stdio/fcloseall.c: New file. * stdio/stdio.h [__USE_GNU]: Add prototype for fcloseall. * stdio/fclose.c: Don't close all streams when argument is NULL. * manual/stdio.texi: Document fcloseall. * sysdeps/generic/abort.c: Call __fcloseall instead of fclose with NULL argument. * socket/sys/un.h (SUN_LEN): Add cast. * sunrpc/auth_unix.c (authunix_create): Change parameter types of uid, gid, and aup_gids to uid_t and gid_t respectively. (authunix_create_default): Likewise. (authunix_refresh): Correct cast for aup_gids assignment. * sunrpc/rpc/auth.h (authunix_create): Correct types in declaration. * sunrpc/rpc/auth_unix.h (struct authunix_parms): Correct field types to uid_t and gid_t respectively. (struct short_hand_verf): Likewise. Reported by Andreas Schwab. * sysdeps/ieee754/Makefile: New file. Make sure ieee754.h gets installed. * sysdeps/ieee754/ieee754.h: Protect against multiple inclusion and use in C++ programs. * sysdeps/libm-i387/e_pow.S: New file. Optimized ix87 assembler version of pow() function. * sysdeps/libm-i387/e_powf.S: New file. Float version. * sysdeps/libm-i387/e_powl.S: New file. Long double version. * sysdeps/libm-i387/s_expm1.S: New file. Optimized ix87 assembler version of expm1() function. * sysdeps/libm-i387/s_expm1f.S: New file. Float version. * sysdeps/libm-i387/s_expm1l.S: New file. Long double version. * sysdeps/libm-i387/e_exp.S: Optimize handling of +-Inf. Better handling of computation stack from current NetBSD sources. * sysdeps/libm-i387/e_expf.S: Likewise. * sysdeps/libm-i387/e_expl.S: Likewise. * sysdeps/libm-i387/e_log.S: Use fstp instead of fincstp. * sysdeps/libm-i387/e_logf.S: Likewise. * sysdeps/libm-i387/e_logl.S: Likewise. * sysdeps/libm-i387/e_log10.S: Likewise. * sysdeps/libm-i387/e_log10f.S: Likewise. * sysdeps/libm-i387/e_log10l.S: Likewise. * sysdeps/libm-i387/s_asinh.S: Likewise. * sysdeps/libm-i387/s_asinhf.S: Likewise. * sysdeps/libm-i387/s_asinhl.S: Likewise. * sysdeps/libm-i387/s_significandl.S: Likewise. * sysdeps/libm-i387/s_ceil.S: Don't create stack frame. Modify stack pointer directly. Use 32 bit instead of 16 bit operations. * sysdeps/libm-i387/s_ceilf.S: Likewise. * sysdeps/libm-i387/s_ceill.S: Likewise. * sysdeps/libm-i387/s_floor.S: Likewise. * sysdeps/libm-i387/s_floorf.S: Likewise. * sysdeps/libm-i387/s_floorl.S: Likewise. * sysdeps/libm-ieee754/e_coshf.c (huge): Don't declare volatile. * sysdeps/libm-ieee754/e_expf.c: Likewise. * sysdeps/libm-ieee754/e_powf.c: Likewise. From current NetBSD sources. * sysdeps/libm-ieee754/e_hypot.c (__ieee754_hypot): Don't initialize `a' and `b' in definition. * sysdeps/libm-ieee754/e_hypotf.c: Likewise. * sysdeps/libm-ieee754/e_hypotl.c: New file. Long double implementation. * sysdeps/libm-ieee754/e_sinhl.c: New file. Long double implementation. * sysdeps/stub/e_hypotl.c: Removed. We have a real version now. * sysdeps/stub/e_sinhl.c: Removed. * sysdeps/posix/sigpause.c (__sigpause): Use sigdelset instead of sigaddset. Reported by Andreas Schwab. (__default_sigpause): New function. Call __sigpause as BSD version. Make this the default function by providing alias sigpause. * sysdeps/stub/sigpause.c (__default_sigpause): New funciton. Simply fail. Provide alias sigpause. Wed Jan 1 12:34:54 1997 Ulrich Drepper <drepper@cygnus.com> * po/es.po: Update for glibc-1.98. * po/fr.po: Likewise. * po/sv.po: New file. Swedish translation. Wed Jan 1 12:18:07 1997 MacGyver <macgyver@tos.net> * values.h: Fix typos: use SHRT_MAX but SHORT_MAX and SHRT_MIN but SHORT_MIN. Tue Dec 24 23:10:21 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makefile: Replace `stubs.h' by `gnu/stubs.h'. * features.h: Include <gnu/stubs.h> instead of <stubs.h>. Tue Dec 24 22:16:55 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makefile (subdirs): Move `elf' last so that librtld.so isn't relinked in the `make others' pass if an add-on adds something to libc. Mon Dec 23 21:23:16 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/abort-instr.h: New File. Mon Dec 23 21:16:38 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/Makefile ($(subdir)=elf): Define CFLAGS-rtld.c to prevent warning. Mon Dec 23 21:14:22 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * resolv/Makefile (subdirs-dirs): Define. Mon Dec 23 20:56:49 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/gnu/utmpbits.h (struct utmp): Fix padding. Mon Dec 30 11:05:11 1996 Ulrich Drepper <drepper@cygnus.com> Update from ADO tzcode1996o. * time/difftime.c: De-ANSI-declfy. Simplify computation of hibit according to ADO version. * time/zic.c: Correct typo is message. Update from ADO tzdata1996n. * time/asia: Updated. * time/australasia: Likewise. * time/europe: Likewise. * time/northamerica: Likewise. * time/southamerica: Likewise.
105 lines
2.9 KiB
C
105 lines
2.9 KiB
C
/* e_expf.c -- float version of e_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.
|
|
* ====================================================
|
|
*/
|
|
|
|
#if defined(LIBM_SCCS) && !defined(lint)
|
|
static char rcsid[] = "$NetBSD: e_expf.c,v 1.6 1996/04/08 15:43:43 phil Exp $";
|
|
#endif
|
|
|
|
#include "math.h"
|
|
#include "math_private.h"
|
|
|
|
static const float huge = 1.0e+30;
|
|
|
|
#ifdef __STDC__
|
|
static const float
|
|
#else
|
|
static float
|
|
#endif
|
|
one = 1.0,
|
|
halF[2] = {0.5,-0.5,},
|
|
twom100 = 7.8886090522e-31, /* 2**-100=0x0d800000 */
|
|
o_threshold= 8.8721679688e+01, /* 0x42b17180 */
|
|
u_threshold= -1.0397208405e+02, /* 0xc2cff1b5 */
|
|
ln2HI[2] ={ 6.9313812256e-01, /* 0x3f317180 */
|
|
-6.9313812256e-01,}, /* 0xbf317180 */
|
|
ln2LO[2] ={ 9.0580006145e-06, /* 0x3717f7d1 */
|
|
-9.0580006145e-06,}, /* 0xb717f7d1 */
|
|
invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */
|
|
P1 = 1.6666667163e-01, /* 0x3e2aaaab */
|
|
P2 = -2.7777778450e-03, /* 0xbb360b61 */
|
|
P3 = 6.6137559770e-05, /* 0x388ab355 */
|
|
P4 = -1.6533901999e-06, /* 0xb5ddea0e */
|
|
P5 = 4.1381369442e-08; /* 0x3331bb4c */
|
|
|
|
#ifdef __STDC__
|
|
float __ieee754_expf(float x) /* default IEEE double exp */
|
|
#else
|
|
float __ieee754_expf(x) /* default IEEE double exp */
|
|
float x;
|
|
#endif
|
|
{
|
|
float y,hi,lo,c,t;
|
|
int32_t k,xsb;
|
|
u_int32_t hx;
|
|
|
|
GET_FLOAT_WORD(hx,x);
|
|
xsb = (hx>>31)&1; /* sign bit of x */
|
|
hx &= 0x7fffffff; /* high word of |x| */
|
|
|
|
/* filter out non-finite argument */
|
|
if(hx >= 0x42b17218) { /* if |x|>=88.721... */
|
|
if(hx>0x7f800000)
|
|
return x+x; /* NaN */
|
|
if(hx==0x7f800000)
|
|
return (xsb==0)? x:0.0; /* exp(+-inf)={inf,0} */
|
|
if(x > o_threshold) return huge*huge; /* overflow */
|
|
if(x < u_threshold) return twom100*twom100; /* underflow */
|
|
}
|
|
|
|
/* argument reduction */
|
|
if(hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */
|
|
if(hx < 0x3F851592) { /* and |x| < 1.5 ln2 */
|
|
hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
|
|
} else {
|
|
k = invln2*x+halF[xsb];
|
|
t = k;
|
|
hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */
|
|
lo = t*ln2LO[0];
|
|
}
|
|
x = hi - lo;
|
|
}
|
|
else if(hx < 0x31800000) { /* when |x|<2**-28 */
|
|
if(huge+x>one) return one+x;/* trigger inexact */
|
|
}
|
|
else k = 0;
|
|
|
|
/* x is now in primary range */
|
|
t = x*x;
|
|
c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
|
|
if(k==0) return one-((x*c)/(c-(float)2.0)-x);
|
|
else y = one-((lo-(x*c)/((float)2.0-c))-hi);
|
|
if(k >= -125) {
|
|
u_int32_t hy;
|
|
GET_FLOAT_WORD(hy,y);
|
|
SET_FLOAT_WORD(y,hy+(k<<23)); /* add k to y's exponent */
|
|
return y;
|
|
} else {
|
|
u_int32_t hy;
|
|
GET_FLOAT_WORD(hy,y);
|
|
SET_FLOAT_WORD(y,hy+((k+100)<<23)); /* add k to y's exponent */
|
|
return y*twom100;
|
|
}
|
|
}
|