2009-03-25 Craig Howland <howland@LGSInnovations.com>

* libc/include/math.h:  (llround, llroundf): Declare.
	* libm/common/s_llround.c: New file, implementing llround().
	* libm/common/sf_llround.c: New file, implementing llroundf().
	* libm/common/sf_lround.c: Remove spurious cast in _DOUBLE_IS_32BITS
	version of function.
	* libm/common/sf_lrint.c: Ditto.
	* libm/common/sf_logb.c:  Corrected return for subnormal argument
	by replacing existing function with a version created from sf_ilogb.c.
	* libm/common/s_logb.c: Ditto, except starting point s_ilogb.c.  Also
	added documentation for logb() and logbf().
	* libm/common/s_signbit.c:  Add signbit() documentation.
	* libm/common/s_log2.c: Update return values to match what w_log2.c has,
	since log2 uses log(); add note about being derived instead of direct.
	* libm/common/sf_fma.c: Add casts to attempt to get correct results,
	as well as comments pointing out problems with the implementation.
	* libm/common/s_fma.c: Add fma() and fmaf() documentation.
	* libm/common/sf_remquo.c: Incorrect quotient returns for large values
	corrected by discarding existing function and replacing with Sun
	verion, with some enhancements.
	* libm/common/s_remquo.c: Ditto.  Add remquo() and remquof()
	documentation.
	* libm/common/s_fmax.c: Add fmax() and fmaxf() documentation.
	* libm/common/s_fmin.c: Add fmin() and fminf() documentation.
	* libm/common/s_fdim.c: Return NAN for NAN arg, add fdim() and fdimf()
	documentation.
	* libm/common/sf_fdim.c: Return NAN for NAN arg, HUGE_VALF for inf arg.
	* libm/common/s_trunc.c: Add trunc() and truncf() documentation.
	* libm/common/s_rint.c: Add rint() and rintf() documentation.
	* libm/common/s_round.c: Add round() and roundf() documentation.
	* libm/common/s_scalbn.c: Add scalbln() and scalblnf() documentation.
	* libm/common/s_infinity.c: Add infinity() and infinityf()
	documentation.
	* libm/common/s_lround.c: Add lround(), lroundf(), llround(), and
	llroundf() documentation.
	* libm/common/s_lrint.c: Add lrint(), lrintf(), llrint(), and llrintf()
	documentation.
	* libm/common/isgreater.c: New file for documenting math.h function-like
	macros isgreater(), isgreaterequal(), isless(), islessequal(),
	islessgreater(), and isunordered().
	* libm/common/s_isnan.c: Add documentation for function-like macros
	fpclassify(), isfinite(), isinf(), isnan(), and isnormal().
	* libm/common/s_nearbyint.c: Add nearbyint() and nearbyintf()
	documentation.
	* libm/common/Makefile.am: Add s_llround.c (src); sf_llround.c (fsrc);
	s_fdim.def, s_fma.def, s_fmax.def, s_fmin.def,
	s_logb.def, s_lrint.def, s_lround.def, s_nearbyint.def, s_remquo.def,
        s_rint.def, s_round.def, s_signbit.def, s_trunc.def, and
        isgreater.def (chobj);
	re-name all existing chew files (chobj) to match source file base
	names (put in underscores), delete all special targets for chew files
	(leaving all to be generated by rule).
	* libm/common/Makefile.in: regenerate.
	* libm/math/w_exp2.c: Add "base 2" to documentation description (and
	delete TRAD_SYNOPSIS).
	* libm/math/w_gamma.c: Add tgamma() and tgammaf() documentation, along
	with some history behind the function names.
	* libm/math/math.tex: Add includes for newly-added documentation (see
	.def additions to common/Makefile.am and math/Makefile.am in this
	ChangeLog list), adjusted existing .def file names to match source file
	base names (added underscores); add mention of HUGE_VALF; rename
	"Version of library" section to "Error Handling" and add some text
	about floating-point exception; added section "Standards Compliance And
	Portability".
	* libm/math/Makefile.am: Add w_exp2.def (chobj);
	re-name all existing chew files (chobj) to match source file base
	names, delete all special targets for chew files (leaving all to be
	generated by rule).
	* libm/math/Makefile.in: regenerated
	* doc/makedoc.c: Change silent ignoring of commands < 5 characters
	to a failure when reading macro file for commands < 4 characters;
	add -v (verbose) option for printing some debugging information;
	get rid of spurious translation of "@*" to "*" (no source files used @*,
	so no existing doc pages were affected); clean up some compiler
	warnings.
	* doc/doc.str: add BUGS and SEEALSO sections (to match texi2pod.pl
	which has them); Remove ITEM command (redundant with makedoc built-in
	"o", not used in any present source file so nothing is lost, anyway).
	* HOWTO: New file to hold information for maintainers regarding how
	to do things.  Initial sections on documentation and ELIX levels.
This commit is contained in:
Jeff Johnston 2009-03-25 19:13:24 +00:00
parent baea11cd6a
commit 139f923bb4
35 changed files with 1451 additions and 652 deletions

View File

@ -1,3 +1,85 @@
2009-03-25 Craig Howland <howland@LGSInnovations.com>
* libc/include/math.h: (llround, llroundf): Declare.
* libm/common/s_llround.c: New file, implementing llround().
* libm/common/sf_llround.c: New file, implementing llroundf().
* libm/common/sf_lround.c: Remove spurious cast in _DOUBLE_IS_32BITS
version of function.
* libm/common/sf_lrint.c: Ditto.
* libm/common/sf_logb.c: Corrected return for subnormal argument
by replacing existing function with a version created from sf_ilogb.c.
* libm/common/s_logb.c: Ditto, except starting point s_ilogb.c. Also
added documentation for logb() and logbf().
* libm/common/s_signbit.c: Add signbit() documentation.
* libm/common/s_log2.c: Update return values to match what w_log2.c has,
since log2 uses log(); add note about being derived instead of direct.
* libm/common/sf_fma.c: Add casts to attempt to get correct results,
as well as comments pointing out problems with the implementation.
* libm/common/s_fma.c: Add fma() and fmaf() documentation.
* libm/common/sf_remquo.c: Incorrect quotient returns for large values
corrected by discarding existing function and replacing with Sun
verion, with some enhancements.
* libm/common/s_remquo.c: Ditto. Add remquo() and remquof()
documentation.
* libm/common/s_fmax.c: Add fmax() and fmaxf() documentation.
* libm/common/s_fmin.c: Add fmin() and fminf() documentation.
* libm/common/s_fdim.c: Return NAN for NAN arg, add fdim() and fdimf()
documentation.
* libm/common/sf_fdim.c: Return NAN for NAN arg, HUGE_VALF for inf arg.
* libm/common/s_trunc.c: Add trunc() and truncf() documentation.
* libm/common/s_rint.c: Add rint() and rintf() documentation.
* libm/common/s_round.c: Add round() and roundf() documentation.
* libm/common/s_scalbn.c: Add scalbln() and scalblnf() documentation.
* libm/common/s_infinity.c: Add infinity() and infinityf()
documentation.
* libm/common/s_lround.c: Add lround(), lroundf(), llround(), and
llroundf() documentation.
* libm/common/s_lrint.c: Add lrint(), lrintf(), llrint(), and llrintf()
documentation.
* libm/common/isgreater.c: New file for documenting math.h function-like
macros isgreater(), isgreaterequal(), isless(), islessequal(),
islessgreater(), and isunordered().
* libm/common/s_isnan.c: Add documentation for function-like macros
fpclassify(), isfinite(), isinf(), isnan(), and isnormal().
* libm/common/s_nearbyint.c: Add nearbyint() and nearbyintf()
documentation.
* libm/common/Makefile.am: Add s_llround.c (src); sf_llround.c (fsrc);
s_fdim.def, s_fma.def, s_fmax.def, s_fmin.def,
s_logb.def, s_lrint.def, s_lround.def, s_nearbyint.def, s_remquo.def,
s_rint.def, s_round.def, s_signbit.def, s_trunc.def, and
isgreater.def (chobj);
re-name all existing chew files (chobj) to match source file base
names (put in underscores), delete all special targets for chew files
(leaving all to be generated by rule).
* libm/common/Makefile.in: regenerate.
* libm/math/w_exp2.c: Add "base 2" to documentation description (and
delete TRAD_SYNOPSIS).
* libm/math/w_gamma.c: Add tgamma() and tgammaf() documentation, along
with some history behind the function names.
* libm/math/math.tex: Add includes for newly-added documentation (see
.def additions to common/Makefile.am and math/Makefile.am in this
ChangeLog list), adjusted existing .def file names to match source file
base names (added underscores); add mention of HUGE_VALF; rename
"Version of library" section to "Error Handling" and add some text
about floating-point exception; added section "Standards Compliance And
Portability".
* libm/math/Makefile.am: Add w_exp2.def (chobj);
re-name all existing chew files (chobj) to match source file base
names, delete all special targets for chew files (leaving all to be
generated by rule).
* libm/math/Makefile.in: regenerated
* doc/makedoc.c: Change silent ignoring of commands < 5 characters
to a failure when reading macro file for commands < 4 characters;
add -v (verbose) option for printing some debugging information;
get rid of spurious translation of "@*" to "*" (no source files used @*,
so no existing doc pages were affected); clean up some compiler
warnings.
* doc/doc.str: add BUGS and SEEALSO sections (to match texi2pod.pl
which has them); Remove ITEM command (redundant with makedoc built-in
"o", not used in any present source file so nothing is lost, anyway).
* HOWTO: New file to hold information for maintainers regarding how
to do things. Initial sections on documentation and ELIX levels.
2009-03-25 Richard Earnshaw <rearnsha@arm.com>
* libc/machine/arm/strcmp.c (strcmp_unaligned): Correctly

View File

@ -229,6 +229,7 @@ extern long int lrint _PARAMS((double));
extern _LONG_LONG_TYPE int llrint _PARAMS((double));
extern double round _PARAMS((double));
extern long int lround _PARAMS((double));
extern long long int llround _PARAMS((double));
extern double trunc _PARAMS((double));
extern double remquo _PARAMS((double, double, int *));
extern double copysign _PARAMS((double, double));
@ -297,6 +298,7 @@ extern long int lrintf _PARAMS((float));
extern _LONG_LONG_TYPE llrintf _PARAMS((float));
extern float roundf _PARAMS((float));
extern long int lroundf _PARAMS((float));
extern long long int llroundf _PARAMS((float));
extern float truncf _PARAMS((float));
extern float remquof _PARAMS((float, float, int *));
extern float copysignf _PARAMS((float, float));

View File

@ -10,7 +10,7 @@ src = s_finite.c s_copysign.c s_modf.c s_scalbn.c \
s_log1p.c s_nan.c s_nextafter.c s_pow10.c \
s_rint.c s_logb.c s_log2.c s_matherr.c s_lib_ver.c \
s_fdim.c s_fma.c s_fmax.c s_fmin.c s_fpclassify.c s_lrint.c \
s_lround.c s_nearbyint.c s_remquo.c s_round.c s_scalbln.c \
s_lround.c s_llround.c s_nearbyint.c s_remquo.c s_round.c s_scalbln.c \
s_signbit.c s_trunc.c
fsrc = sf_finite.c sf_copysign.c sf_modf.c sf_scalbn.c \
@ -19,7 +19,7 @@ fsrc = sf_finite.c sf_copysign.c sf_modf.c sf_scalbn.c \
sf_log1p.c sf_nan.c sf_nextafter.c sf_pow10.c \
sf_rint.c sf_logb.c sf_log2.c \
sf_fdim.c sf_fma.c sf_fmax.c sf_fmin.c sf_fpclassify.c sf_lrint.c \
sf_lround.c sf_nearbyint.c sf_remquo.c sf_round.c \
sf_lround.c sf_llround.c sf_nearbyint.c sf_remquo.c sf_round.c \
sf_scalbln.c sf_trunc.c
libcommon_la_LDFLAGS = -Xcompiler -nostdlib
@ -37,9 +37,13 @@ endif # USE_LIBTOOL
include $(srcdir)/../../Makefile.shared
chobj = scbrt.def scopysign.def sexp10.def sexpm1.def silogb.def \
sinfinity.def sisnan.def slog1p.def smatherr.def smodf.def \
snan.def snextafter.def spow10.def sscalbn.def
chobj = s_cbrt.def s_copysign.def s_exp10.def s_expm1.def s_ilogb.def \
s_infinity.def s_isnan.def s_log1p.def s_matherr.def s_modf.def \
s_nan.def s_nextafter.def s_pow10.def s_scalbn.def \
s_fdim.def s_fma.def s_fmax.def s_fmin.def \
s_logb.def s_log2.def s_lrint.def s_lround.def s_nearbyint.def \
s_remquo.def s_rint.def s_round.def s_signbit.def s_trunc.def \
isgreater.def
SUFFIXES = .def
@ -55,73 +59,6 @@ doc: $(chobj)
CLEANFILES = $(chobj) *.ref
# Texinfo does not appear to support underscores in file names, so we
# name the .def files without underscores.
scopysign.def: s_copysign.c
$(CHEW) < $(srcdir)/s_copysign.c >$@ 2>/dev/null
touch stmp-def
scbrt.def: s_cbrt.c
$(CHEW) < $(srcdir)/s_cbrt.c >$@ 2>/dev/null
touch stmp-def
serf.def: s_erf.c
$(CHEW) < $(srcdir)/s_serf.c >$@ 2>/dev/null
touch stmp-def
sexp10.def: s_exp10.c
$(CHEW) < $(srcdir)/s_exp10.c >$@ 2>/dev/null
touch stmp-def
sexpm1.def: s_expm1.c
$(CHEW) < $(srcdir)/s_expm1.c >$@ 2>/dev/null
touch stmp-def
silogb.def: s_ilogb.c
$(CHEW) < $(srcdir)/s_ilogb.c >$@ 2>/dev/null
touch stmp-def
sinfinity.def: s_infinity.c
$(CHEW) < $(srcdir)/s_infinity.c >$@ 2>/dev/null
touch stmp-def
sisnan.def: s_isnan.c
$(CHEW) < $(srcdir)/s_isnan.c >$@ 2>/dev/null
touch stmp-def
slog1p.def: s_log1p.c
$(CHEW) < $(srcdir)/s_log1p.c >$@ 2>/dev/null
touch stmp-def
slog2.def: s_log2.c
$(CHEW) < $(srcdir)/s_log2.c >$@ 2>/dev/null
touch stmp-def
smodf.def: s_modf.c
$(CHEW) < $(srcdir)/s_modf.c >$@ 2>/dev/null
touch stmp-def
smatherr.def: s_matherr.c
$(CHEW) < $(srcdir)/s_matherr.c >$@ 2>/dev/null
touch stmp-def
snan.def: s_nan.c
$(CHEW) < $(srcdir)/s_nan.c >$@ 2>/dev/null
touch stmp-def
snextafter.def: s_nextafter.c
$(CHEW) < $(srcdir)/s_nextafter.c >$@ 2>/dev/null
touch stmp-def
spow10.def: s_pow10.c
$(CHEW) < $(srcdir)/s_pow10.c >$@ 2>/dev/null
touch stmp-def
sscalbn.def: s_scalbn.c
$(CHEW) < $(srcdir)/s_scalbn.c >$@ 2>/dev/null
touch stmp-def
# A partial dependency list.
$(lib_a_OBJECTS): $(srcdir)/../../libc/include/math.h fdlibm.h

View File

@ -72,9 +72,10 @@ am__objects_1 = lib_a-s_finite.$(OBJEXT) lib_a-s_copysign.$(OBJEXT) \
lib_a-s_fma.$(OBJEXT) lib_a-s_fmax.$(OBJEXT) \
lib_a-s_fmin.$(OBJEXT) lib_a-s_fpclassify.$(OBJEXT) \
lib_a-s_lrint.$(OBJEXT) lib_a-s_lround.$(OBJEXT) \
lib_a-s_nearbyint.$(OBJEXT) lib_a-s_remquo.$(OBJEXT) \
lib_a-s_round.$(OBJEXT) lib_a-s_scalbln.$(OBJEXT) \
lib_a-s_signbit.$(OBJEXT) lib_a-s_trunc.$(OBJEXT)
lib_a-s_llround.$(OBJEXT) lib_a-s_nearbyint.$(OBJEXT) \
lib_a-s_remquo.$(OBJEXT) lib_a-s_round.$(OBJEXT) \
lib_a-s_scalbln.$(OBJEXT) lib_a-s_signbit.$(OBJEXT) \
lib_a-s_trunc.$(OBJEXT)
am__objects_2 = lib_a-sf_finite.$(OBJEXT) lib_a-sf_copysign.$(OBJEXT) \
lib_a-sf_modf.$(OBJEXT) lib_a-sf_scalbn.$(OBJEXT) \
lib_a-sf_cbrt.$(OBJEXT) lib_a-sf_exp10.$(OBJEXT) \
@ -88,9 +89,10 @@ am__objects_2 = lib_a-sf_finite.$(OBJEXT) lib_a-sf_copysign.$(OBJEXT) \
lib_a-sf_fdim.$(OBJEXT) lib_a-sf_fma.$(OBJEXT) \
lib_a-sf_fmax.$(OBJEXT) lib_a-sf_fmin.$(OBJEXT) \
lib_a-sf_fpclassify.$(OBJEXT) lib_a-sf_lrint.$(OBJEXT) \
lib_a-sf_lround.$(OBJEXT) lib_a-sf_nearbyint.$(OBJEXT) \
lib_a-sf_remquo.$(OBJEXT) lib_a-sf_round.$(OBJEXT) \
lib_a-sf_scalbln.$(OBJEXT) lib_a-sf_trunc.$(OBJEXT)
lib_a-sf_lround.$(OBJEXT) lib_a-sf_llround.$(OBJEXT) \
lib_a-sf_nearbyint.$(OBJEXT) lib_a-sf_remquo.$(OBJEXT) \
lib_a-sf_round.$(OBJEXT) lib_a-sf_scalbln.$(OBJEXT) \
lib_a-sf_trunc.$(OBJEXT)
@USE_LIBTOOL_FALSE@am_lib_a_OBJECTS = $(am__objects_1) \
@USE_LIBTOOL_FALSE@ $(am__objects_2)
lib_a_OBJECTS = $(am_lib_a_OBJECTS)
@ -102,15 +104,16 @@ am__objects_3 = s_finite.lo s_copysign.lo s_modf.lo s_scalbn.lo \
s_log1p.lo s_nan.lo s_nextafter.lo s_pow10.lo s_rint.lo \
s_logb.lo s_log2.lo s_matherr.lo s_lib_ver.lo s_fdim.lo \
s_fma.lo s_fmax.lo s_fmin.lo s_fpclassify.lo s_lrint.lo \
s_lround.lo s_nearbyint.lo s_remquo.lo s_round.lo s_scalbln.lo \
s_signbit.lo s_trunc.lo
s_lround.lo s_llround.lo s_nearbyint.lo s_remquo.lo s_round.lo \
s_scalbln.lo s_signbit.lo s_trunc.lo
am__objects_4 = sf_finite.lo sf_copysign.lo sf_modf.lo sf_scalbn.lo \
sf_cbrt.lo sf_exp10.lo sf_expm1.lo sf_ilogb.lo sf_infinity.lo \
sf_isinf.lo sf_isinff.lo sf_isnan.lo sf_isnanf.lo sf_log1p.lo \
sf_nan.lo sf_nextafter.lo sf_pow10.lo sf_rint.lo sf_logb.lo \
sf_log2.lo sf_fdim.lo sf_fma.lo sf_fmax.lo sf_fmin.lo \
sf_fpclassify.lo sf_lrint.lo sf_lround.lo sf_nearbyint.lo \
sf_remquo.lo sf_round.lo sf_scalbln.lo sf_trunc.lo
sf_fpclassify.lo sf_lrint.lo sf_lround.lo sf_llround.lo \
sf_nearbyint.lo sf_remquo.lo sf_round.lo sf_scalbln.lo \
sf_trunc.lo
@USE_LIBTOOL_TRUE@am_libcommon_la_OBJECTS = $(am__objects_3) \
@USE_LIBTOOL_TRUE@ $(am__objects_4)
libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS)
@ -280,7 +283,7 @@ src = s_finite.c s_copysign.c s_modf.c s_scalbn.c \
s_log1p.c s_nan.c s_nextafter.c s_pow10.c \
s_rint.c s_logb.c s_log2.c s_matherr.c s_lib_ver.c \
s_fdim.c s_fma.c s_fmax.c s_fmin.c s_fpclassify.c s_lrint.c \
s_lround.c s_nearbyint.c s_remquo.c s_round.c s_scalbln.c \
s_lround.c s_llround.c s_nearbyint.c s_remquo.c s_round.c s_scalbln.c \
s_signbit.c s_trunc.c
fsrc = sf_finite.c sf_copysign.c sf_modf.c sf_scalbn.c \
@ -289,7 +292,7 @@ fsrc = sf_finite.c sf_copysign.c sf_modf.c sf_scalbn.c \
sf_log1p.c sf_nan.c sf_nextafter.c sf_pow10.c \
sf_rint.c sf_logb.c sf_log2.c \
sf_fdim.c sf_fma.c sf_fmax.c sf_fmin.c sf_fpclassify.c sf_lrint.c \
sf_lround.c sf_nearbyint.c sf_remquo.c sf_round.c \
sf_lround.c sf_llround.c sf_nearbyint.c sf_remquo.c sf_round.c \
sf_scalbln.c sf_trunc.c
libcommon_la_LDFLAGS = -Xcompiler -nostdlib
@ -300,9 +303,13 @@ libcommon_la_LDFLAGS = -Xcompiler -nostdlib
@USE_LIBTOOL_FALSE@noinst_LIBRARIES = lib.a
@USE_LIBTOOL_FALSE@lib_a_SOURCES = $(src) $(fsrc)
@USE_LIBTOOL_FALSE@lib_a_CFLAGS = $(AM_CFLAGS)
chobj = scbrt.def scopysign.def sexp10.def sexpm1.def silogb.def \
sinfinity.def sisnan.def slog1p.def smatherr.def smodf.def \
snan.def snextafter.def spow10.def sscalbn.def
chobj = s_cbrt.def s_copysign.def s_exp10.def s_expm1.def s_ilogb.def \
s_infinity.def s_isnan.def s_log1p.def s_matherr.def s_modf.def \
s_nan.def s_nextafter.def s_pow10.def s_scalbn.def \
s_fdim.def s_fma.def s_fmax.def s_fmin.def \
s_logb.def s_log2.def s_lrint.def s_lround.def s_nearbyint.def \
s_remquo.def s_rint.def s_round.def s_signbit.def s_trunc.def \
isgreater.def
SUFFIXES = .def
CHEW = ../../doc/makedoc -f $(srcdir)/../../doc/doc.str
@ -555,6 +562,12 @@ lib_a-s_lround.o: s_lround.c
lib_a-s_lround.obj: s_lround.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_lround.obj `if test -f 's_lround.c'; then $(CYGPATH_W) 's_lround.c'; else $(CYGPATH_W) '$(srcdir)/s_lround.c'; fi`
lib_a-s_llround.o: s_llround.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_llround.o `test -f 's_llround.c' || echo '$(srcdir)/'`s_llround.c
lib_a-s_llround.obj: s_llround.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_llround.obj `if test -f 's_llround.c'; then $(CYGPATH_W) 's_llround.c'; else $(CYGPATH_W) '$(srcdir)/s_llround.c'; fi`
lib_a-s_nearbyint.o: s_nearbyint.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_nearbyint.o `test -f 's_nearbyint.c' || echo '$(srcdir)/'`s_nearbyint.c
@ -753,6 +766,12 @@ lib_a-sf_lround.o: sf_lround.c
lib_a-sf_lround.obj: sf_lround.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_lround.obj `if test -f 'sf_lround.c'; then $(CYGPATH_W) 'sf_lround.c'; else $(CYGPATH_W) '$(srcdir)/sf_lround.c'; fi`
lib_a-sf_llround.o: sf_llround.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_llround.o `test -f 'sf_llround.c' || echo '$(srcdir)/'`sf_llround.c
lib_a-sf_llround.obj: sf_llround.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_llround.obj `if test -f 'sf_llround.c'; then $(CYGPATH_W) 'sf_llround.c'; else $(CYGPATH_W) '$(srcdir)/sf_llround.c'; fi`
lib_a-sf_nearbyint.o: sf_nearbyint.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_nearbyint.o `test -f 'sf_nearbyint.c' || echo '$(srcdir)/'`sf_nearbyint.c
@ -943,73 +962,6 @@ objectlist.awk.in: $(noinst_LTLIBRARIES)
doc: $(chobj)
# Texinfo does not appear to support underscores in file names, so we
# name the .def files without underscores.
scopysign.def: s_copysign.c
$(CHEW) < $(srcdir)/s_copysign.c >$@ 2>/dev/null
touch stmp-def
scbrt.def: s_cbrt.c
$(CHEW) < $(srcdir)/s_cbrt.c >$@ 2>/dev/null
touch stmp-def
serf.def: s_erf.c
$(CHEW) < $(srcdir)/s_serf.c >$@ 2>/dev/null
touch stmp-def
sexp10.def: s_exp10.c
$(CHEW) < $(srcdir)/s_exp10.c >$@ 2>/dev/null
touch stmp-def
sexpm1.def: s_expm1.c
$(CHEW) < $(srcdir)/s_expm1.c >$@ 2>/dev/null
touch stmp-def
silogb.def: s_ilogb.c
$(CHEW) < $(srcdir)/s_ilogb.c >$@ 2>/dev/null
touch stmp-def
sinfinity.def: s_infinity.c
$(CHEW) < $(srcdir)/s_infinity.c >$@ 2>/dev/null
touch stmp-def
sisnan.def: s_isnan.c
$(CHEW) < $(srcdir)/s_isnan.c >$@ 2>/dev/null
touch stmp-def
slog1p.def: s_log1p.c
$(CHEW) < $(srcdir)/s_log1p.c >$@ 2>/dev/null
touch stmp-def
slog2.def: s_log2.c
$(CHEW) < $(srcdir)/s_log2.c >$@ 2>/dev/null
touch stmp-def
smodf.def: s_modf.c
$(CHEW) < $(srcdir)/s_modf.c >$@ 2>/dev/null
touch stmp-def
smatherr.def: s_matherr.c
$(CHEW) < $(srcdir)/s_matherr.c >$@ 2>/dev/null
touch stmp-def
snan.def: s_nan.c
$(CHEW) < $(srcdir)/s_nan.c >$@ 2>/dev/null
touch stmp-def
snextafter.def: s_nextafter.c
$(CHEW) < $(srcdir)/s_nextafter.c >$@ 2>/dev/null
touch stmp-def
spow10.def: s_pow10.c
$(CHEW) < $(srcdir)/s_pow10.c >$@ 2>/dev/null
touch stmp-def
sscalbn.def: s_scalbn.c
$(CHEW) < $(srcdir)/s_scalbn.c >$@ 2>/dev/null
touch stmp-def
# A partial dependency list.
$(lib_a_OBJECTS): $(srcdir)/../../libc/include/math.h fdlibm.h

View File

@ -0,0 +1,75 @@
/* isgreater.c: This file contains no source code, but rather only the
* man-page comments. All of the documented "functions" are actually macros
* defined in math.h (q.v.). */
/*
FUNCTION
<<isgreater>>, <<isgreaterequal>>, <<isless>>, <<islessequal>>, <<islessgreater>>, and <<isunordered>>--comparison macros
INDEX
isgreater
INDEX
isgreaterequal
INDEX
isless
INDEX
islessequal
INDEX
islessgreater
INDEX
isunordered
ANSI_SYNOPSIS
#include <math.h>
int isgreater(real-floating <[x]>, real-floating <[y]>);
int isgreaterequal(real-floating <[x]>, real-floating <[y]>);
int isless(real-floating <[x]>, real-floating <[y]>);
int islessequal(real-floating <[x]>, real-floating <[y]>);
int islessgreater(real-floating <[x]>, real-floating <[y]>);
int isunordered(real-floating <[x]>, real-floating <[y]>);
DESCRIPTION
<<isgreater>>, <<isgreaterequal>>, <<isless>>, <<islessequal>>,
<<islessgreater>>, and <<isunordered>> are macros defined for use in
comparing floating-point numbers without raising any floating-point
exceptions.
The relational operators (i.e. <, >, <=, and >=) support the usual mathematical
relationships between numeric values. For any ordered pair of numeric
values exactly one of the relationships--less, greater, and equal--is
true. Relational operators may raise the "invalid" floating-point
exception when argument values are NaNs. For a NaN and a numeric value, or
for two NaNs, just the unordered relationship is true (i.e., if one or both
of the arguments a NaN, the relationship is called unordered). The specified
macros are quiet (non floating-point exception raising) versions of the
relational operators, and other comparison macros that facilitate writing
efficient code that accounts for NaNs without suffering the "invalid"
floating-point exception. In the synopses shown, "real-floating" indicates
that the argument is an expression of real floating type.
Please note that saying that the macros do not raise floating-point
exceptions, it is referring to the function that they are performing. It
is certainly possible to give them an expression which causes an exception.
For example:
o+
o NaN < 1.0
causes an "invalid" exception,
o isless(NaN, 1.0)
does not, and
o isless(NaN*0., 1.0)
causes an exception due to the "NaN*0.", but not from the
resultant reduced comparison of isless(NaN, 1.0).
o-
RETURNS
@comment Formatting note: "$@" forces a new line
No floating-point exceptions are raised for any of the macros.@*
The <<isgreater>> macro returns the value of (x) > (y).@*
The <<isgreaterequal>> macro returns the value of (x) >= (y).@*
The <<isless>> macro returns the value of (x) < (y).@*
The <<islessequal>> macro returns the value of (x) <= (y).@*
The <<islessgreater>> macro returns the value of (x) < (y) || (x) > (y).@*
The <<isunordered>> macro returns 1 if either of its arguments is NaN and 0 otherwise.
PORTABILITY
C99, POSIX.
*/

View File

@ -3,6 +3,39 @@
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
/*
FUNCTION
<<fdim>>, <<fdimf>>--positive difference
INDEX
fdim
INDEX
fdimf
ANSI_SYNOPSIS
#include <math.h>
double fdim(double <[x]>, double <[y]>);
float fdimf(float <[x]>, float <[y]>);
DESCRIPTION
The <<fdim>> functions determine the positive difference between their
arguments, returning:
. <[x]> - <[y]> if <[x]> > <[y]>, or
@ifnottex
. +0 if <[x]> <= <[y]>, or
@end ifnottex
@tex
. +0 if <[x]> $\leq$ <[y]>, or
@end tex
. NAN if either argument is NAN.
A range error may occur.
RETURNS
The <<fdim>> functions return the positive difference value.
PORTABILITY
ANSI C, POSIX.
*/
#include "fdlibm.h"
@ -17,7 +50,9 @@
#endif
{
int c = __fpclassifyd(x);
if (c == FP_NAN || c == FP_INFINITE)
if (c == FP_NAN) return(x);
if (__fpclassifyd(y) == FP_NAN) return(y);
if (c == FP_INFINITE)
return HUGE_VAL;
return x > y ? x - y : 0.0;

View File

@ -1,3 +1,41 @@
/*
FUNCTION
<<fma>>, <<fmaf>>--floating multiply add
INDEX
fma
INDEX
fmaf
ANSI_SYNOPSIS
#include <math.h>
double fma(double <[x]>, double <[y]>, double <[z]>);
float fmaf(float <[x]>, float <[y]>, float <[z]>);
DESCRIPTION
The <<fma>> functions compute (<[x]> * <[y]>) + <[z]>, rounded as one ternary
operation: they compute the value (as if) to infinite precision and round once
to the result format, according to the rounding mode characterized by the value
of FLT_ROUNDS. That is, they are supposed to do this: see below.
RETURNS
The <<fma>> functions return (<[x]> * <[y]>) + <[z]>, rounded as one ternary
operation.
BUGS
This implementation does not provide the function that it should, purely
returning "(<[x]> * <[y]>) + <[z]>;" with no attempt at all to provide the
simulated infinite precision intermediates which are required. DO NOT USE THEM.
If double has enough more precision than float, then <<fmaf>> should provide
the expected numeric results, as it does use double for the calculation. But
since this is not the case for all platforms, this manual cannot determine
if it is so for your case.
PORTABILITY
ANSI C, POSIX.
*/
#include "fdlibm.h"
#ifndef _DOUBLE_IS_32BITS

View File

@ -3,6 +3,31 @@
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
/*
FUNCTION
<<fmax>>, <<fmaxf>>--maximum
INDEX
fmax
INDEX
fmaxf
ANSI_SYNOPSIS
#include <math.h>
double fmax(double <[x]>, double <[y]>);
float fmaxf(float <[x]>, float <[y]>);
DESCRIPTION
The <<fmax>> functions determine the maximum numeric value of their arguments.
NaN arguments are treated as missing data: if one argument is a NaN and the
other numeric, then the <<fmax>> functions choose the numeric value.
RETURNS
The <<fmax>> functions return the maximum numeric value of their arguments.
PORTABILITY
ANSI C, POSIX.
*/
#include "fdlibm.h"

View File

@ -3,6 +3,31 @@
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
/*
FUNCTION
<<fmin>>, <<fminf>>--minimum
INDEX
fmin
INDEX
fminf
ANSI_SYNOPSIS
#include <math.h>
double fmin(double <[x]>, double <[y]>);
float fminf(float <[x]>, float <[y]>);
DESCRIPTION
The <<fmin>> functions determine the minimum numeric value of their arguments.
NaN arguments are treated as missing data: if one argument is a NaN and the
other numeric, then the <<fmin>> functions choose the numeric value.
RETURNS
The <<fmin>> functions return the minimum numeric value of their arguments.
PORTABILITY
ANSI C, POSIX.
*/
#include "fdlibm.h"

View File

@ -5,7 +5,7 @@
/*
FUNCTION
<<infinity>>, <<infinityf>>---representation of infinity
<<infinity>>, <<infinityf>>--representation of infinity
INDEX
infinity
@ -17,17 +17,18 @@ ANSI_SYNOPSIS
double infinity(void);
float infinityf(void);
TRAD_SYNOPSIS
#include <math.h>
double infinity();
float infinityf();
DESCRIPTION
<<infinity>> and <<infinityf>> return the special number IEEE
infinity in double- and single-precision arithmetic
respectively.
PORTABILITY
<<infinity>> and <<infinityf>> are neither standard C nor POSIX. C and
POSIX require macros HUGE_VAL and HUGE_VALF to be defined in math.h, which
Newlib defines to be infinities corresponding to these archaic infinity()
and infinityf() functions in floating-point implementations which do have
infinities.
QUICKREF
infinity - pure

View File

@ -13,8 +13,21 @@
/*
FUNCTION
<<isnan>>, <<isnanf>>, <<isinf>>, <<isinff>>, <<finite>>, <<finitef>>---test for exceptional numbers
<<fpclassify>>, <<isfinite>>, <<isinf>>, <<isnan>>, and <<isnormal>>--floating-point classification macros; <<finite>>, <<finitef>>, <<isinf>>, <<isinff>>, <<isnan>>, <<isnanf>>--test for exceptional numbers
@c C99 (start
INDEX
fpclassify
INDEX
isfinite
INDEX
isinf
INDEX
isnan
INDEX
isnormal
@c C99 end)
@c SUSv2 (start
INDEX
isnan
INDEX
@ -28,8 +41,18 @@ INDEX
isinff
INDEX
finitef
@c SUSv2 end)
ANSI_SYNOPSIS
[C99 standard macros:]
#include <math.h>
int fpclassify(real-floating <[x]>);
int isfinite(real-floating <[x]>);
int isinf(real-floating <[x]>);
int isnan(real-floating <[x]>);
int isnormal(real-floating <[x]>);
[Archaic SUSv2 functions:]
#include <ieeefp.h>
int isnan(double <[arg]>);
int isinf(double <[arg]>);
@ -38,30 +61,64 @@ ANSI_SYNOPSIS
int isinff(float <[arg]>);
int finitef(float <[arg]>);
TRAD_SYNOPSIS
#include <ieeefp.h>
int isnan(<[arg]>)
double <[arg]>;
int isinf(<[arg]>)
double <[arg]>;
int finite(<[arg]>);
double <[arg]>;
int isnanf(<[arg]>);
float <[arg]>;
int isinff(<[arg]>);
float <[arg]>;
int finitef(<[arg]>);
float <[arg]>;
DESCRIPTION
These functions provide information on the floating-point
<<fpclassify>>, <<isfinite>>, <<isinf>>, <<isnan>>, and <<isnormal>> are macros
defined for use in classifying floating-point numbers. This is a help because
of special "values" like NaN and infinities. In the synopses shown,
"real-floating" indicates that the argument is an expression of real floating
type. These function-like macros are C99 and POSIX-compliant, and should be
used instead of the now-archaic SUSv2 functions.
The <<fpclassify>> macro classifies its argument value as NaN, infinite, normal,
subnormal, zero, or into another implementation-defined category. First, an
argument represented in a format wider than its semantic type is converted to
its semantic type. Then classification is based on the type of the argument.
The <<fpclassify>> macro returns the value of the number classification macro
appropriate to the value of its argument:
o+
o FP_INFINITE
<[x]> is either plus or minus infinity;
o FP_NAN
<[x]> is "Not A Number" (plus or minus);
o FP_NORMAL
<[x]> is a "normal" number (i.e. is none of the other special forms);
o FP_SUBNORMAL
<[x]> is too small be stored as a regular normalized number (i.e. loss of precision is likely); or
o FP_ZERO
<[x]> is 0 (either plus or minus).
o-
The "<<is>>" set of macros provide a useful set of shorthand ways for
classifying floating-point numbers, providing the following equivalent
relations:
o+
o <<isfinite>>(<[x]>)
returns non-zero if <[x]> is finite. (It is equivalent to
(<<fpclassify>>(<[x]>) != FP_INFINITE && <<fpclassify>>(<[x]>) != FP_NAN).)
o <<isinf>>(<[x]>)
returns non-zero if <[x]> is infinite. (It is equivalent to
(<<fpclassify>>(<[x]>) == FP_INFINITE).)
o <<isnan>>(<[x]>)
returns non-zero if <[x]> is NaN. (It is equivalent to
(<<fpclassify>>(<[x]>) == FP_NAN).)
o <<isnormal>>(<[x]>)
returns non-zero if <[x]> is normal. (It is equivalent to
(<<fpclassify>>(<[x]>) == FP_NORMAL).)
o-
The archaic SUSv2 functions provide information on the floating-point
argument supplied.
There are five major number formats:
There are five major number formats ("exponent" referring to the
biased exponent in the binary-encoded number):
o+
o zero
A number which contains all zero bits.
A number which contains all zero bits, excluding the sign bit.
o subnormal
A number with a zero exponent but a nonzero fraction.
o normal
@ -85,7 +142,21 @@ DESCRIPTION
and <<isinf>> are macros that operate on multiple types of
floating-point. The SUSv2 standard declares <<isnan>> as
a function taking double. Newlib has decided to declare
them both as macros in math.h and as functions in ieeefp.h.
them both as macros in math.h and as functions in ieeefp.h to
maintain backward compatibility.
RETURNS
@comment Formatting note: "$@" forces a new line
The fpclassify macro returns the value corresponding to the appropriate FP_ macro.@*
The isfinite macro returns nonzero if <[x]> is finite, else 0.@*
The isinf macro returns nonzero if <[x]> is infinite, else 0.@*
The isnan macro returns nonzero if <[x]> is an NaN, else 0.@*
The isnormal macro returns nonzero if <[x]> has a normal value, else 0.
PORTABILITY
math.h macros are C99, POSIX.
ieeefp.h funtions are outdated and should be avoided.
QUICKREF
isnan - pure

View File

@ -0,0 +1,68 @@
/* lround adapted to be llround for Newlib, 2009 by Craig Howland. */
/*
* ====================================================
* 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.
* ====================================================
*/
#include "fdlibm.h"
#ifndef _DOUBLE_IS_32BITS
long long int
llround(double x)
{
__int32_t sign, exponent_less_1023;
/* Most significant word, least significant word. */
__uint32_t msw, lsw;
long long int result;
EXTRACT_WORDS(msw, lsw, x);
/* Extract sign. */
sign = ((msw & 0x80000000) ? -1 : 1);
/* Extract exponent field. */
exponent_less_1023 = ((msw & 0x7ff00000) >> 20) - 1023;
msw &= 0x000fffff;
msw |= 0x00100000;
if (exponent_less_1023 < 20)
{
if (exponent_less_1023 < 0)
{
if (exponent_less_1023 < -1)
return 0;
else
return sign;
}
else
{
msw += 0x80000 >> exponent_less_1023;
result = msw >> (20 - exponent_less_1023);
}
}
else if (exponent_less_1023 < (8 * sizeof (long long int)) - 1)
{
if (exponent_less_1023 >= 52)
result = ((long long int) msw << (exponent_less_1023 - 20)) | (lsw << (exponent_less_1023 - 52));
else
{
unsigned int tmp = lsw + (0x80000000 >> (exponent_less_1023 - 20));
if (tmp < lsw)
++msw;
result = ((long long int) msw << (exponent_less_1023 - 20)) | (tmp >> (52 - exponent_less_1023));
}
}
else
/* Result is too large to be represented by a long long int. */
return (long long int)x;
return sign * result;
}
#endif /* _DOUBLE_IS_32BITS */

View File

@ -14,7 +14,7 @@
/*
FUNCTION
<<log2>>, <<log2f>>---base 2 logarithm
<<log2>>, <<log2f>>--base 2 logarithm
INDEX
log2
INDEX
@ -25,28 +25,40 @@ ANSI_SYNOPSIS
double log2(double <[x]>);
float log2f(float <[x]>);
TRAD_SYNOPSIS
#include <math.h>
double log2(<[x]>);
double <[x]>;
float log2f(<[x]>);
float <[x]>;
DESCRIPTION
<<log2>> returns the base 2 logarithm of <[x]>.
The <<log2>> functions compute the base-2 logarithm of <[x]>. A domain error
occurs if the argument is less than zero. A range error occurs if the
argument is zero.
<<log2f>> is identical, save that it takes and returns <<float>> values.
The Newlib implementations are not full, intrinisic calculations, but
rather are derivatives based on <<log>>. (Accuracy might be slightly off from
a direct calculation.) In addition to functions, they are also implemented as
macros defined in math.h:
. #define log2(x) (log (x) / _M_LOG2_E)
. #define log2f(x) (logf (x) / (float) _M_LOG2_E)
To use the functions instead, just undefine the macros first.
You can use the (non-ANSI) function <<matherr>> to specify error
handling for these functions, indirectly through the respective <<log>>
function.
RETURNS
On success, <<log2>> and <<log2f>> return the calculated value.
If the result underflows, the returned value is <<0>>. If the
result overflows, the returned value is <<HUGE_VAL>>. In
either case, <<errno>> is set to <<ERANGE>>.
The <<log2>> functions return
@ifnottex
<<log base-2(<[x]>)>>
@end ifnottex
@tex
$log_2(x)$
@end tex
on success.
When <[x]> is zero, the
returned value is <<-HUGE_VAL>> and <<errno>> is set to <<ERANGE>>.
When <[x]> is negative, the returned value is NaN (not a number) and
<<errno>> is set to <<EDOM>>. You can control the error behavior via
<<matherr>>.
PORTABILITY
<<log2>> and <<log2f>> are required by ISO/IEC 9899:1999 and the
System V Interface Definition (Issue 6).
C99, POSIX, System V Interface Definition (Issue 6).
*/
/*

View File

@ -1,5 +1,5 @@
/* @(#)s_logb.c 5.1 93/09/24 */
/* 2009 for Newlib: Sun's s_ilogb.c converted to be s_logb.c. */
/* @(#)s_ilogb.c 5.1 93/09/24 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@ -10,33 +10,101 @@
* is preserved.
* ====================================================
*/
/*
* double logb(x)
* IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
* Use ilogb instead.
FUNCTION
<<logb>>, <<logbf>>--get exponent of floating-point number
INDEX
logb
INDEX
logbf
ANSI_SYNOPSIS
#include <math.h>
double logb(double <[x]>);
float logbf(float <[x]>);
DESCRIPTION
The <<logb>> functions extract the exponent of <[x]>, as a signed integer value
in floating-point format. If <[x]> is subnormal it is treated as though it were
normalized; thus, for positive finite <[x]>,
@ifnottex
1 <= (<[x]> * FLT_RADIX to the power (-logb(<[x]>))) < FLT_RADIX.
@end ifnottex
@tex
$1 \leq ( x \cdot FLT\_RADIX ^ {-logb(x)} ) < FLT\_RADIX$.
@end tex
A domain error may occur if the argument is zero.
In this floating-point implementation, FLT_RADIX is 2. Which also means
that for finite <[x]>, <<logb>>(<[x]>) = <<floor>>(<<log2>>(<<fabs>>(<[x]>))).
All nonzero, normal numbers can be described as
@ifnottex
<[m]> * 2**<[p]>, where 1.0 <= <[m]> < 2.0.
@end ifnottex
@tex
$m \cdot 2^p$, where $1.0 \leq m < 2.0$.
@end tex
The <<logb>> functions examine the argument <[x]>, and return <[p]>.
The <<frexp>> functions are similar to the <<logb>> functions, but
returning <[m]> adjusted to the interval [.5, 1) or 0, and <[p]>+1.
RETURNS
@comment Formatting note: "$@" forces a new line
When <[x]> is:@*
+inf or -inf, +inf is returned;@*
NaN, NaN is returned;@*
0, -inf is returned, and the divide-by-zero exception is raised;@*
otherwise, the <<logb>> functions return the signed exponent of <[x]>.
PORTABILITY
ANSI C, POSIX
SEEALSO
frexp, ilogb
*/
/* double logb(double x)
* return the binary exponent of non-zero x
* logb(0) = -inf, raise divide-by-zero floating point exception
* logb(+inf|-inf) = +inf (no signal is raised)
* logb(NaN) = NaN (no signal is raised)
* Per C99 recommendation, a NaN argument is returned unchanged.
*/
#include "fdlibm.h"
#ifndef _DOUBLE_IS_32BITS
double
#ifdef __STDC__
double logb(double x)
logb(double x)
#else
double logb(x)
double x;
logb(x)
double x;
#endif
{
__int32_t lx,ix;
EXTRACT_WORDS(ix,lx,x);
ix &= 0x7fffffff; /* high |x| */
if((ix|lx)==0) return -1.0/fabs(x);
if(ix>=0x7ff00000) return x*x;
if((ix>>=20)==0) /* IEEE 754 logb */
return -1022.0;
else
return (double) (ix-1023);
__int32_t hx,lx,ix;
EXTRACT_WORDS(hx,lx,x);
hx &= 0x7fffffff; /* high |x| */
if(hx<0x00100000) { /* 0 or subnormal */
if((hx|lx)==0) {
double xx;
/* arg==0: return -inf and raise divide-by-zero exception */
INSERT_WORDS(xx,hx,lx); /* +0.0 */
return -1./xx; /* logb(0) = -inf */
}
else /* subnormal x */
if(hx==0) {
for (ix = -1043; lx>0; lx<<=1) ix -=1;
} else {
for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
}
return (double) ix;
}
else if (hx<0x7ff00000) return (hx>>20)-1023; /* normal # */
else if (hx>0x7ff00000 || lx) return x; /* x==NaN */
else return HUGE_VAL; /* x==inf (+ or -) */
}
#endif /* _DOUBLE_IS_32BITS */

View File

@ -10,6 +10,44 @@
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<lrint>>, <<lrintf>>, <<llrint>>, <<llrintf>>--round to integer
INDEX
lrint
INDEX
lrintf
INDEX
llrint
INDEX
llrintf
ANSI_SYNOPSIS
#include <math.h>
long int lrint(double <[x]>);
long int lrintf(float <[x]>);
long long int llrint(double <[x]>);
long long int llrintf(float <[x]>);
DESCRIPTION
The <<lrint>> and <<llrint>> functions round their argument to the nearest
integer value, using the current rounding direction. If the rounded value is
outside the range of the return type, the numeric result is unspecified. A
range error may occur if the magnitude of <[x]> is too large.
The "inexact" floating-point exception is raised in implementations that
support it when the result differs in value from the argument (i.e., when
a fraction actually has been truncated).
RETURNS
<[x]> rounded to an integral value, using the current rounding direction.
SEEALSO
<<lround>>
PORTABILITY
ANSI C, POSIX
*/
/*
* lrint(x)

View File

@ -8,6 +8,44 @@
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<lround>>, <<lroundf>>, <<llround>>, <<llroundf>>--round to integer, to nearest
INDEX
lround
INDEX
lroundf
INDEX
llround
INDEX
llroundf
ANSI_SYNOPSIS
#include <math.h>
long int lround(double <[x]>);
long int lroundf(float <[x]>);
long long int llround(double <[x]>);
long long int llroundf(float <[x]>);
DESCRIPTION
The <<lround>> and <<llround>> functions round their argument to the
nearest integer value, rounding halfway cases away from zero, regardless
of the current rounding direction. If the rounded value is outside the
range of the return type, the numeric result is unspecified (depending
upon the floating-point implementation, not the library). A range
error may occur if the magnitude of x is too large.
RETURNS
<[x]> rounded to an integral value as an integer.
SEEALSO
See the <<round>> functions for the return being the same floating-point type
as the argument. <<lrint>>, <<llrint>>.
PORTABILITY
ANSI C, POSIX
*/
#include "fdlibm.h"

View File

@ -8,6 +8,43 @@
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<nearbyint>>, <<nearbyintf>>--round to integer
INDEX
nearbyint
INDEX
nearbyintf
ANSI_SYNOPSIS
#include <math.h>
double nearbyint(double <[x]>);
float nearbyintf(float <[x]>);
DESCRIPTION
The <<nearbyint>> functions round their argument to an integer value in
floating-point format, using the current rounding direction and
(supposedly) without raising the "inexact" floating-point exception.
See the <<rint>> functions for the same function with the "inexact"
floating-point exception being raised when appropriate.
BUGS
Newlib does not support the floating-point exception model, so that
the floating-point exception control is not present and thereby what may
be seen will be compiler and hardware dependent in this regard.
The Newlib <<nearbyint>> functions are identical to the <<rint>>
functions with respect to the floating-point exception behavior, and
will cause the "inexact" exception to be raised for most targets.
RETURNS
<[x]> rounded to an integral value, using the current rounding direction.
PORTABILITY
ANSI C, POSIX
SEEALSO
<<rint>>, <<round>>
*/
#include <math.h>
#include "fdlibm.h"

View File

@ -1,39 +1,208 @@
/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved.
/* Adapted for Newlib, 2009. (Allow for int < 32 bits; return *quo=0 during
* errors to make test scripts easier.) */
/* @(#)e_fmod.c 1.3 95/01/18 */
/*-
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<remquo>>, <<remquof>>--remainder and part of quotient
INDEX
remquo
INDEX
remquof
ANSI_SYNOPSIS
#include <math.h>
double remquo(double <[x]>, double <[y]>, int *<[quo]>);
float remquof(float <[x]>, float <[y]>, int *<[quo]>);
DESCRIPTION
The <<remquo>> functions compute the same remainder as the <<remainder>>
functions; this value is in the range -<[y]>/2 ... +<[y]>/2. In the object
pointed to by <<quo>> they store a value whose sign is the sign of <<x>>/<<y>>
and whose magnitude is congruent modulo 2**n to the magnitude of the integral
quotient of <<x>>/<<y>>. (That is, <<quo>> is given the n lsbs of the
quotient, not counting the sign.) This implementation uses n=31 if int is 32
bits or more, otherwise, n is 1 less than the width of int.
For example:
. remquo(-29.0, 3.0, &<[quo]>)
returns -1.0 and sets <[quo]>=10, and
. remquo(-98307.0, 3.0, &<[quo]>)
returns -0.0 and sets <[quo]>=-32769, although for 16-bit int, <[quo]>=-1. In
the latter case, the actual quotient of -(32769=0x8001) is reduced to -1
because of the 15-bit limitation for the quotient.
RETURNS
When either argument is NaN, NaN is returned. If <[y]> is 0 or <[x]> is
infinite (and neither is NaN), a domain error occurs (i.e. the "invalid"
floating point exception is raised or errno is set to EDOM), and NaN is
returned.
Otherwise, the <<remquo>> functions return <[x]> REM <[y]>.
BUGS
IEEE754-2008 calls for <<remquo>>(subnormal, inf) to cause the "underflow"
floating-point exception. This implementation does not.
PORTABILITY
C99, POSIX.
*/
#include <limits.h>
#include <math.h>
#include "fdlibm.h"
#ifndef _DOUBLE_IS_32BITS
#ifdef __STDC__
double remquo(double x, double y, int *quo) /* wrapper remquo */
#else
double remquo(x,y,quo) /* wrapper remquo */
double x,y;
int *quo;
/* For quotient, return either all 31 bits that can from calculation (using
* int32_t), or as many as can fit into an int that is smaller than 32 bits. */
#if INT_MAX > 0x7FFFFFFFL
#define QUO_MASK 0x7FFFFFFF
# else
#define QUO_MASK INT_MAX
#endif
static const double Zero[] = {0.0, -0.0,};
/*
* Return the IEEE remainder and set *quo to the last n bits of the
* quotient, rounded to the nearest integer. We choose n=31--if that many fit--
* because we wind up computing all the integer bits of the quotient anyway as
* a side-effect of computing the remainder by the shift and subtract
* method. In practice, this is far more bits than are needed to use
* remquo in reduction algorithms.
*/
double
remquo(double x, double y, int *quo)
{
int signx, signy, signres;
int mswx;
int mswy;
double x_over_y;
__int32_t n,hx,hy,hz,ix,iy,sx,i;
__uint32_t lx,ly,lz,q,sxy;
GET_HIGH_WORD(mswx, x);
GET_HIGH_WORD(mswy, y);
EXTRACT_WORDS(hx,lx,x);
EXTRACT_WORDS(hy,ly,y);
sxy = (hx ^ hy) & 0x80000000;
sx = hx&0x80000000; /* sign of x */
hx ^=sx; /* |x| */
hy &= 0x7fffffff; /* |y| */
signx = (mswx & 0x80000000) >> 31;
signy = (mswy & 0x80000000) >> 31;
/* purge off exception values */
if((hy|ly)==0||(hx>=0x7ff00000)|| /* y=0,or x not finite */
((hy|((ly|-ly)>>31))>0x7ff00000)) { /* or y is NaN */
*quo = 0; /* Not necessary, but return consistent value */
return (x*y)/(x*y);
}
if(hx<=hy) {
if((hx<hy)||(lx<ly)) {
q = 0;
goto fixup; /* |x|<|y| return x or x-y */
}
if(lx==ly) {
*quo = 1;
return Zero[(__uint32_t)sx>>31]; /* |x|=|y| return x*0*/
}
}
signres = (signx ^ signy) ? -1 : 1;
/* determine ix = ilogb(x) */
if(hx<0x00100000) { /* subnormal x */
if(hx==0) {
for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
} else {
for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
}
} else ix = (hx>>20)-1023;
x_over_y = fabs(x / y);
/* determine iy = ilogb(y) */
if(hy<0x00100000) { /* subnormal y */
if(hy==0) {
for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
} else {
for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
}
} else iy = (hy>>20)-1023;
*quo = signres * (lrint(x_over_y) & 0x7f);
/* set up {hx,lx}, {hy,ly} and align y to x */
if(ix >= -1022)
hx = 0x00100000|(0x000fffff&hx);
else { /* subnormal x, shift x to normal */
n = -1022-ix;
if(n<=31) {
hx = (hx<<n)|(lx>>(32-n));
lx <<= n;
} else {
hx = lx<<(n-32);
lx = 0;
}
}
if(iy >= -1022)
hy = 0x00100000|(0x000fffff&hy);
else { /* subnormal y, shift y to normal */
n = -1022-iy;
if(n<=31) {
hy = (hy<<n)|(ly>>(32-n));
ly <<= n;
} else {
hy = ly<<(n-32);
ly = 0;
}
}
return remainder(x,y);
/* fix point fmod */
n = ix - iy;
q = 0;
while(n--) {
hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
else {hx = hz+hz+(lz>>31); lx = lz+lz; q++;}
q <<= 1;
}
hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
if(hz>=0) {hx=hz;lx=lz;q++;}
/* convert back to floating value and restore the sign */
if((hx|lx)==0) { /* return sign(x)*0 */
q &= QUO_MASK;
*quo = (sxy ? -q : q);
return Zero[(__uint32_t)sx>>31];
}
while(hx<0x00100000) { /* normalize x */
hx = hx+hx+(lx>>31); lx = lx+lx;
iy -= 1;
}
if(iy>= -1022) { /* normalize output */
hx = ((hx-0x00100000)|((iy+1023)<<20));
} else { /* subnormal output */
n = -1022 - iy;
if(n<=20) {
lx = (lx>>n)|((__uint32_t)hx<<(32-n));
hx >>= n;
} else if (n<=31) {
lx = (hx<<(32-n))|(lx>>n); hx = sx;
} else {
lx = hx>>(n-32); hx = sx;
}
}
fixup:
INSERT_WORDS(x,hx,lx);
y = fabs(y);
if (y < 0x1p-1021) {
if (x+x>y || (x+x==y && (q & 1))) {
q++;
x-=y;
}
} else if (x>0.5*y || (x==0.5*y && (q & 1))) {
q++;
x-=y;
}
GET_HIGH_WORD(hx,x);
SET_HIGH_WORD(x,hx^sx);
q &= QUO_MASK;
*quo = (sxy ? -q : q);
return x;
}
#endif /* defined(_DOUBLE_IS_32BITS) */

View File

@ -10,6 +10,40 @@
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<rint>>, <<rintf>>--round to integer
INDEX
rint
INDEX
rintf
ANSI_SYNOPSIS
#include <math.h>
double rint(double <[x]>);
float rintf(float <[x]>);
DESCRIPTION
The <<rint>> functions round their argument to an integer value in
floating-point format, using the current rounding direction. They
raise the "inexact" floating-point exception if the result differs
in value from the argument. See the <<nearbyint>> functions for the
same function with the "inexact" floating-point exception never being
raised. Newlib does not directly support floating-point exceptions.
The <<rint>> functions are written so that the "inexact" exception is
raised in hardware implementations that support it, even though Newlib
does not provide access.
RETURNS
<[x]> rounded to an integral value, using the current rounding direction.
PORTABILITY
ANSI C, POSIX
SEEALSO
<<nearbyint>>, <<round>>
*/
/*
* rint(x)

View File

@ -8,6 +8,38 @@
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<round>>, <<roundf>>--round to integer, to nearest
INDEX
round
INDEX
roundf
ANSI_SYNOPSIS
#include <math.h>
double round(double <[x]>);
float roundf(float <[x]>);
DESCRIPTION
The <<round>> functions round their argument to the nearest integer
value in floating-point format, rounding halfway cases away from zero,
regardless of the current rounding direction. (While the "inexact"
floating-point exception behavior is unspecified by the C standard, the
<<round>> functions are written so that "inexact" is not raised if the
result does not equal the argument, which behavior is as recommended by
IEEE 754 for its related functions.)
RETURNS
<[x]> rounded to an integral value.
PORTABILITY
ANSI C, POSIX
SEEALSO
<<nearbyint>>, <<rint>>
*/
#include "fdlibm.h"

View File

@ -13,38 +13,44 @@
/*
FUNCTION
<<scalbn>>, <<scalbnf>>---scale by power of two
<<scalbn>>, <<scalbnf>>, <<scalbln>>, <<scalblnf>>--scale by power of FLT_RADIX (=2)
INDEX
scalbn
INDEX
scalbnf
INDEX
scalbln
INDEX
scalblnf
ANSI_SYNOPSIS
#include <math.h>
double scalbn(double <[x]>, int <[y]>);
float scalbnf(float <[x]>, int <[y]>);
TRAD_SYNOPSIS
#include <math.h>
double scalbn(<[x]>,<[y]>)
double <[x]>;
int <[y]>;
float scalbnf(<[x]>,<[y]>)
float <[x]>;
int <[y]>;
double scalbn(double <[x]>, int <[n]>);
float scalbnf(float <[x]>, int <[n]>);
double scalbln(double <[x]>, long int <[n]>);
float scalblnf(float <[x]>, long int <[n]>);
DESCRIPTION
<<scalbn>> and <<scalbnf>> scale <[x]> by <[n]>, returning <[x]> times
2 to the power <[n]>. The result is computed by manipulating the
exponent, rather than by actually performing an exponentiation or
multiplication.
The <<scalbn>> and <<scalbln>> functions compute
@ifnottex
<[x]> times FLT_RADIX to the power <[n]>.
@end ifnottex
@tex
$x \cdot FLT\_RADIX^n$.
@end tex
efficiently. The result is computed by manipulating the exponent, rather than
by actually performing an exponentiation or multiplication. In this
floating-point implementation FLT_RADIX=2, which makes the <<scalbn>>
functions equivalent to the <<ldexp>> functions.
RETURNS
<[x]> times 2 to the power <[n]>.
<[x]> times 2 to the power <[n]>. A range error may occur.
PORTABILITY
Neither <<scalbn>> nor <<scalbnf>> is required by ANSI C or by the System V
Interface Definition (Issue 2).
ANSI C, POSIX
SEEALSO
<<ldexp>>
*/

View File

@ -3,6 +3,35 @@
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
/*
FUNCTION
<<signbit>>--Does floating-point number have negative sign?
INDEX
signbit
ANSI_SYNOPSIS
#include <math.h>
int signbit(real-floating <[x]>);
DESCRIPTION
The <<signbit>> macro determines whether the sign of its argument value is
negative. The macro reports the sign of all values, including infinities,
zeros, and NaNs. If zero is unsigned, it is treated as positive. As shown in
the synopsis, the argument is "real-floating," meaning that any of the real
floating-point types (float, double, etc.) may be given to it.
Note that because of the possibilities of signed 0 and NaNs, the expression
"<[x]> < 0.0" does not give the same result as <<signbit>> in all cases.
RETURNS
The <<signbit>> macro returns a nonzero value if and only if the sign of its
argument value is negative.
PORTABILITY
C99, POSIX.
*/
#include "fdlibm.h"

View File

@ -8,6 +8,35 @@
* is preserved.
* ====================================================
*/
/*
FUNCTION
<<trunc>>, <<truncf>>--round to integer, towards zero
INDEX
trunc
INDEX
truncf
ANSI_SYNOPSIS
#include <math.h>
double trunc(double <[x]>);
float truncf(float <[x]>);
DESCRIPTION
The <<trunc>> functions round their argument to the integer value, in
floating format, nearest to but no larger in magnitude than the
argument, regardless of the current rounding direction. (While the
"inexact" floating-point exception behavior is unspecified by the C
standard, the <<trunc>> functions are written so that "inexact" is not
raised if the result does not equal the argument, which behavior is as
recommended by IEEE 754 for its related functions.)
RETURNS
<[x]> truncated to an integral value.
PORTABILITY
ANSI C, POSIX
*/
#include "fdlibm.h"

View File

@ -15,8 +15,10 @@
#endif
{
int c = __fpclassifyf(x);
if (c == FP_NAN || c == FP_INFINITE)
return HUGE_VAL;
if (c == FP_NAN) return(x);
if (__fpclassifyf(y) == FP_NAN) return(y);
if (c == FP_INFINITE)
return HUGE_VALF;
return x > y ? x - y : 0.0;
}

View File

@ -15,8 +15,14 @@
float z;
#endif
{
/* Let the implementation handle this. */
return (x * y) + z;
/* NOTE: The floating-point exception behavior of this is not as
* required. But since the basic function is not really done properly,
* it is not worth bothering to get the exceptions right, either. */
/* Let the implementation handle this. */ /* <= NONSENSE! */
/* In floating-point implementations in which double is larger than float,
* computing as double should provide the desired function. Otherwise,
* the behavior will not be as specified in the standards. */
return (float) (((double) x * (double) y) + (double) z);
}
#ifdef _DOUBLE_IS_32BITS

View File

@ -0,0 +1,55 @@
/* lroundf adapted to be llroundf for Newlib, 2009 by Craig Howland. */
/*
* ====================================================
* 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.
* ====================================================
*/
#include "fdlibm.h"
long long int
llroundf(float x)
{
__int32_t exponent_less_127;
__uint32_t w;
long long int result;
__int32_t sign;
GET_FLOAT_WORD (w, x);
exponent_less_127 = ((w & 0x7f800000) >> 23) - 127;
sign = (w & 0x80000000) != 0 ? -1 : 1;
w &= 0x7fffff;
w |= 0x800000;
if (exponent_less_127 < (int)((8 * sizeof (long long int)) - 1))
{
if (exponent_less_127 < 0)
return exponent_less_127 < -1 ? 0 : sign;
else if (exponent_less_127 >= 23)
result = (long long int) w << (exponent_less_127 - 23);
else
{
w += 0x400000 >> exponent_less_127;
result = w >> (23 - exponent_less_127);
}
}
else
return (long long int) x;
return sign * result;
}
#ifdef _DOUBLE_IS_32BITS
long long int
llround(double x)
{
return llroundf((float) x);
}
#endif /* defined(_DOUBLE_IS_32BITS) */

View File

@ -1,7 +1,4 @@
/* sf_logb.c -- float version of s_logb.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/* 2009 for Newlib: Sun's sf_ilogb.c converted to be sf_logb.c. */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@ -13,24 +10,41 @@
* ====================================================
*/
/* float logb(float x)
* return the binary exponent of non-zero x
* logbf(0) = -inf, raise divide-by-zero floating point exception
* logbf(+inf|-inf) = +inf (no signal is raised)
* logbf(NaN) = NaN (no signal is raised)
* Per C99 recommendation, a NaN argument is returned unchanged.
*/
#include "fdlibm.h"
float
#ifdef __STDC__
float logbf(float x)
logbf(float x)
#else
float logbf(x)
float x;
logbf(x)
float x;
#endif
{
__int32_t ix;
GET_FLOAT_WORD(ix,x);
ix &= 0x7fffffff; /* high |x| */
if(FLT_UWORD_IS_ZERO(ix)) return (float)-1.0/fabsf(x);
if(!FLT_UWORD_IS_FINITE(ix)) return x*x;
if((ix>>=23)==0) /* IEEE 754 logb */
return -126.0;
else
return (float) (ix-127);
__int32_t hx,ix;
GET_FLOAT_WORD(hx,x);
hx &= 0x7fffffff;
if(FLT_UWORD_IS_ZERO(hx)) {
float xx;
/* arg==0: return -inf and raise divide-by-zero exception */
SET_FLOAT_WORD(xx,hx); /* +0.0 */
return -1./xx; /* logbf(0) = -inf */
}
if(FLT_UWORD_IS_SUBNORMAL(hx)) {
for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1;
return (float) ix;
}
else if (FLT_UWORD_IS_INFINITE(hx)) return HUGE_VALF; /* x==+|-inf */
else if (FLT_UWORD_IS_NAN(hx)) return x;
else return (float) ((hx>>23)-127);
}
#ifdef _DOUBLE_IS_32BITS

View File

@ -95,7 +95,7 @@ TWO23[2]={
double x;
#endif
{
return (double) lrintf((float) x);
return lrintf((float) x);
}
#endif /* defined(_DOUBLE_IS_32BITS) */

View File

@ -56,7 +56,7 @@
double x;
#endif
{
return (double) lroundf((float) x);
return lroundf((float) x);
}
#endif /* defined(_DOUBLE_IS_32BITS) */

View File

@ -1,50 +1,130 @@
/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved.
/* Adapted for Newlib, 2009. (Allow for int < 32 bits; return *quo=0 during
* errors to make test scripts easier.) */
/* @(#)e_fmod.c 1.3 95/01/18 */
/*-
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#include <math.h>
#include "fdlibm.h"
#ifdef __STDC__
float remquof(float x, float y, int *quo) /* wrapper remquof */
#else
float remquof(x,y,quo) /* wrapper remquof */
float x,y;
int *quo;
/* For quotient, return either all 31 bits that can from calculation (using
* int32_t), or as many as can fit into an int that is smaller than 32 bits. */
#if INT_MAX > 0x7FFFFFFFL
#define QUO_MASK 0x7FFFFFFF
# else
#define QUO_MASK INT_MAX
#endif
static const float Zero[] = {0.0, -0.0,};
/*
* Return the IEEE remainder and set *quo to the last n bits of the
* quotient, rounded to the nearest integer. We choose n=31--if that many fit--
* we wind up computing all the integer bits of the quotient anyway as
* a side-effect of computing the remainder by the shift and subtract
* method. In practice, this is far more bits than are needed to use
* remquo in reduction algorithms.
*/
float
remquof(float x, float y, int *quo)
{
int signx, signy, signres;
int wx;
int wy;
float x_over_y;
__int32_t n,hx,hy,hz,ix,iy,sx,i;
__uint32_t q,sxy;
GET_FLOAT_WORD(wx, x);
GET_FLOAT_WORD(wy, y);
GET_FLOAT_WORD(hx,x);
GET_FLOAT_WORD(hy,y);
sxy = (hx ^ hy) & 0x80000000;
sx = hx&0x80000000; /* sign of x */
hx ^=sx; /* |x| */
hy &= 0x7fffffff; /* |y| */
signx = (wx & 0x80000000) >> 31;
signy = (wy & 0x80000000) >> 31;
/* purge off exception values */
if(hy==0||hx>=0x7f800000||hy>0x7f800000) { /* y=0,NaN;or x not finite */
*quo = 0; /* Not necessary, but return consistent value */
return (x*y)/(x*y);
}
if(hx<hy) {
q = 0;
goto fixup; /* |x|<|y| return x or x-y */
} else if(hx==hy) {
*quo = 1;
return Zero[(__uint32_t)sx>>31]; /* |x|=|y| return x*0*/
}
signres = (signx ^ signy) ? -1 : 1;
/* determine ix = ilogb(x) */
if(hx<0x00800000) { /* subnormal x */
for (ix = -126,i=(hx<<8); i>0; i<<=1) ix -=1;
} else ix = (hx>>23)-127;
x_over_y = fabsf(x / y);
/* determine iy = ilogb(y) */
if(hy<0x00800000) { /* subnormal y */
for (iy = -126,i=(hy<<8); i>0; i<<=1) iy -=1;
} else iy = (hy>>23)-127;
*quo = signres * (lrintf(x_over_y) & 0x7f);
/* set up {hx,lx}, {hy,ly} and align y to x */
if(ix >= -126)
hx = 0x00800000|(0x007fffff&hx);
else { /* subnormal x, shift x to normal */
n = -126-ix;
hx <<= n;
}
if(iy >= -126)
hy = 0x00800000|(0x007fffff&hy);
else { /* subnormal y, shift y to normal */
n = -126-iy;
hy <<= n;
}
return remainderf(x,y);
/* fix point fmod */
n = ix - iy;
q = 0;
while(n--) {
hz=hx-hy;
if(hz<0) hx = hx << 1;
else {hx = hz << 1; q++;}
q <<= 1;
}
hz=hx-hy;
if(hz>=0) {hx=hz;q++;}
/* convert back to floating value and restore the sign */
if(hx==0) { /* return sign(x)*0 */
*quo = (sxy ? -q : q);
return Zero[(__uint32_t)sx>>31];
}
while(hx<0x00800000) { /* normalize x */
hx <<= 1;
iy -= 1;
}
if(iy>= -126) { /* normalize output */
hx = ((hx-0x00800000)|((iy+127)<<23));
} else { /* subnormal output */
n = -126 - iy;
hx >>= n;
}
fixup:
SET_FLOAT_WORD(x,hx);
y = fabsf(y);
if (y < 0x1p-125f) {
if (x+x>y || (x+x==y && (q & 1))) {
q++;
x-=y;
}
} else if (x>0.5f*y || (x==0.5f*y && (q & 1))) {
q++;
x-=y;
}
GET_FLOAT_WORD(hx,x);
SET_FLOAT_WORD(x,hx^sx);
q &= 0x7fffffff;
*quo = (sxy ? -q : q);
return x;
}
#ifdef _DOUBLE_IS_32BITS
#ifdef __STDC__
double remquo(double x, double y, int *quo) /* wrapper remquof */
#else
double remquo(x,y,quo) /* wrapper remquof */
double x,y;
int *quo;
#endif
{
return (double) remquof((float) x, (float) y, quo);
}
#endif /* defined(_DOUBLE_IS_32BITS) */

View File

@ -65,14 +65,14 @@ endif # USE_LIBTOOL
include $(srcdir)/../../Makefile.shared
chobj = wacos.def wacosh.def wasin.def sasinh.def \
satan.def watan2.def watanh.def wj0.def \
wcosh.def serf.def wexp.def \
sfabs.def sfloor.def wfmod.def sfrexp.def \
wgamma.def whypot.def sldexp.def wlog.def \
wlog10.def \
wpow.def wremainder.def ssin.def wsinh.def \
wsqrt.def stan.def stanh.def
chobj = w_acos.def w_acosh.def w_asin.def s_asinh.def \
s_atan.def w_atan2.def w_atanh.def w_j0.def \
w_cosh.def s_erf.def w_exp.def w_exp2.def \
s_fabs.def s_floor.def w_fmod.def s_frexp.def \
w_gamma.def w_hypot.def s_ldexp.def w_log.def \
w_log10.def \
w_pow.def w_remainder.def s_sin.def w_sinh.def \
w_sqrt.def s_tan.def s_tanh.def
SUFFIXES = .def
@ -89,94 +89,6 @@ doc: $(chobj)
CLEANFILES = $(chobj) *.ref
# Texinfo does not appear to support underscores in file names, so we
# name the .def files without underscores.
wacos.def: w_acos.c
$(CHEW) < $(srcdir)/w_acos.c >$@ 2>/dev/null
touch stmp-def
wacosh.def: w_acosh.c
$(CHEW) < $(srcdir)/w_acosh.c >$@ 2>/dev/null
touch stmp-def
wasin.def: w_asin.c
$(CHEW) < $(srcdir)/w_asin.c >$@ 2>/dev/null
touch stmp-def
sasinh.def: s_asinh.c
$(CHEW) < $(srcdir)/s_asinh.c >$@ 2>/dev/null
touch stmp-def
satan.def: s_atan.c
$(CHEW) < $(srcdir)/s_atan.c >$@ 2>/dev/null
touch stmp-def
watan2.def: w_atan2.c
$(CHEW) < $(srcdir)/w_atan2.c >$@ 2>/dev/null
touch stmp-def
watanh.def: w_atanh.c
$(CHEW) < $(srcdir)/w_atanh.c >$@ 2>/dev/null
touch stmp-def
wj0.def: w_j0.c
$(CHEW) < $(srcdir)/w_j0.c >$@ 2>/dev/null
touch stmp-def
scopysign.def: s_copysign.c
$(CHEW) < $(srcdir)/../common/s_copysign.c >$@ 2>/dev/null
touch stmp-def
wcosh.def: w_cosh.c
$(CHEW) < $(srcdir)/w_cosh.c >$@ 2>/dev/null
touch stmp-def
serf.def: s_erf.c
$(CHEW) < $(srcdir)/s_erf.c >$@ 2>/dev/null
touch stmp-def
wexp.def: w_exp.c
$(CHEW) < $(srcdir)/w_exp.c >$@ 2>/dev/null
touch stmp-def
sfabs.def: s_fabs.c
$(CHEW) < $(srcdir)/s_fabs.c >$@ 2>/dev/null
touch stmp-def
sfloor.def: s_floor.c
$(CHEW) < $(srcdir)/s_floor.c >$@ 2>/dev/null
touch stmp-def
wfmod.def: w_fmod.c
$(CHEW) < $(srcdir)/w_fmod.c >$@ 2>/dev/null
touch stmp-def
sfrexp.def: s_frexp.c
$(CHEW) < $(srcdir)/s_frexp.c >$@ 2>/dev/null
touch stmp-def
wgamma.def: w_gamma.c
$(CHEW) < $(srcdir)/w_gamma.c >$@ 2>/dev/null
touch stmp-def
whypot.def: w_hypot.c
$(CHEW) < $(srcdir)/w_hypot.c >$@ 2>/dev/null
touch stmp-def
sldexp.def: s_ldexp.c
$(CHEW) < $(srcdir)/s_ldexp.c >$@ 2>/dev/null
touch stmp-def
wlog.def: w_log.c
$(CHEW) < $(srcdir)/w_log.c >$@ 2>/dev/null
touch stmp-def
wlog10.def: w_log10.c
$(CHEW) < $(srcdir)/w_log10.c >$@ 2>/dev/null
touch stmp-def
wpow.def: w_pow.c
$(CHEW) < $(srcdir)/w_pow.c >$@ 2>/dev/null
touch stmp-def
wremainder.def: w_remainder.c
$(CHEW) < $(srcdir)/w_remainder.c >$@ 2>/dev/null
touch stmp-def
ssin.def: s_sin.c
$(CHEW) < $(srcdir)/s_sin.c >$@ 2>/dev/null
touch stmp-def
wsinh.def: w_sinh.c
$(CHEW) < $(srcdir)/w_sinh.c >$@ 2>/dev/null
touch stmp-def
wsqrt.def: w_sqrt.c
$(CHEW) < $(srcdir)/w_sqrt.c >$@ 2>/dev/null
touch stmp-def
stan.def: s_tan.c
$(CHEW) < $(srcdir)/s_tan.c >$@ 2>/dev/null
touch stmp-def
stanh.def: s_tanh.c
$(CHEW) < $(srcdir)/s_tanh.c >$@ 2>/dev/null
touch stmp-def
# A partial dependency list.
$(lib_a_OBJECTS): $(srcdir)/../../libc/include/math.h $(srcdir)/../common/fdlibm.h

View File

@ -373,14 +373,14 @@ libmath_la_LDFLAGS = -Xcompiler -nostdlib
@USE_LIBTOOL_FALSE@noinst_LIBRARIES = lib.a
@USE_LIBTOOL_FALSE@lib_a_SOURCES = $(src) $(fsrc)
@USE_LIBTOOL_FALSE@lib_a_CFLAGS = $(AM_CFLAGS)
chobj = wacos.def wacosh.def wasin.def sasinh.def \
satan.def watan2.def watanh.def wj0.def \
wcosh.def serf.def wexp.def \
sfabs.def sfloor.def wfmod.def sfrexp.def \
wgamma.def whypot.def sldexp.def wlog.def \
wlog10.def \
wpow.def wremainder.def ssin.def wsinh.def \
wsqrt.def stan.def stanh.def
chobj = w_acos.def w_acosh.def w_asin.def s_asinh.def \
s_atan.def w_atan2.def w_atanh.def w_j0.def \
w_cosh.def s_erf.def w_exp.def w_exp2.def \
s_fabs.def s_floor.def w_fmod.def s_frexp.def \
w_gamma.def w_hypot.def s_ldexp.def w_log.def \
w_log10.def \
w_pow.def w_remainder.def s_sin.def w_sinh.def \
w_sqrt.def s_tan.def s_tanh.def
SUFFIXES = .def
CHEW = ../../doc/makedoc -f $(srcdir)/../../doc/doc.str
@ -1424,94 +1424,6 @@ objectlist.awk.in: $(noinst_LTLIBRARIES)
doc: $(chobj)
cat $(srcdir)/math.tex >> $(TARGETDOC)
# Texinfo does not appear to support underscores in file names, so we
# name the .def files without underscores.
wacos.def: w_acos.c
$(CHEW) < $(srcdir)/w_acos.c >$@ 2>/dev/null
touch stmp-def
wacosh.def: w_acosh.c
$(CHEW) < $(srcdir)/w_acosh.c >$@ 2>/dev/null
touch stmp-def
wasin.def: w_asin.c
$(CHEW) < $(srcdir)/w_asin.c >$@ 2>/dev/null
touch stmp-def
sasinh.def: s_asinh.c
$(CHEW) < $(srcdir)/s_asinh.c >$@ 2>/dev/null
touch stmp-def
satan.def: s_atan.c
$(CHEW) < $(srcdir)/s_atan.c >$@ 2>/dev/null
touch stmp-def
watan2.def: w_atan2.c
$(CHEW) < $(srcdir)/w_atan2.c >$@ 2>/dev/null
touch stmp-def
watanh.def: w_atanh.c
$(CHEW) < $(srcdir)/w_atanh.c >$@ 2>/dev/null
touch stmp-def
wj0.def: w_j0.c
$(CHEW) < $(srcdir)/w_j0.c >$@ 2>/dev/null
touch stmp-def
scopysign.def: s_copysign.c
$(CHEW) < $(srcdir)/../common/s_copysign.c >$@ 2>/dev/null
touch stmp-def
wcosh.def: w_cosh.c
$(CHEW) < $(srcdir)/w_cosh.c >$@ 2>/dev/null
touch stmp-def
serf.def: s_erf.c
$(CHEW) < $(srcdir)/s_erf.c >$@ 2>/dev/null
touch stmp-def
wexp.def: w_exp.c
$(CHEW) < $(srcdir)/w_exp.c >$@ 2>/dev/null
touch stmp-def
sfabs.def: s_fabs.c
$(CHEW) < $(srcdir)/s_fabs.c >$@ 2>/dev/null
touch stmp-def
sfloor.def: s_floor.c
$(CHEW) < $(srcdir)/s_floor.c >$@ 2>/dev/null
touch stmp-def
wfmod.def: w_fmod.c
$(CHEW) < $(srcdir)/w_fmod.c >$@ 2>/dev/null
touch stmp-def
sfrexp.def: s_frexp.c
$(CHEW) < $(srcdir)/s_frexp.c >$@ 2>/dev/null
touch stmp-def
wgamma.def: w_gamma.c
$(CHEW) < $(srcdir)/w_gamma.c >$@ 2>/dev/null
touch stmp-def
whypot.def: w_hypot.c
$(CHEW) < $(srcdir)/w_hypot.c >$@ 2>/dev/null
touch stmp-def
sldexp.def: s_ldexp.c
$(CHEW) < $(srcdir)/s_ldexp.c >$@ 2>/dev/null
touch stmp-def
wlog.def: w_log.c
$(CHEW) < $(srcdir)/w_log.c >$@ 2>/dev/null
touch stmp-def
wlog10.def: w_log10.c
$(CHEW) < $(srcdir)/w_log10.c >$@ 2>/dev/null
touch stmp-def
wpow.def: w_pow.c
$(CHEW) < $(srcdir)/w_pow.c >$@ 2>/dev/null
touch stmp-def
wremainder.def: w_remainder.c
$(CHEW) < $(srcdir)/w_remainder.c >$@ 2>/dev/null
touch stmp-def
ssin.def: s_sin.c
$(CHEW) < $(srcdir)/s_sin.c >$@ 2>/dev/null
touch stmp-def
wsinh.def: w_sinh.c
$(CHEW) < $(srcdir)/w_sinh.c >$@ 2>/dev/null
touch stmp-def
wsqrt.def: w_sqrt.c
$(CHEW) < $(srcdir)/w_sqrt.c >$@ 2>/dev/null
touch stmp-def
stan.def: s_tan.c
$(CHEW) < $(srcdir)/s_tan.c >$@ 2>/dev/null
touch stmp-def
stanh.def: s_tanh.c
$(CHEW) < $(srcdir)/s_tanh.c >$@ 2>/dev/null
touch stmp-def
# A partial dependency list.
$(lib_a_OBJECTS): $(srcdir)/../../libc/include/math.h $(srcdir)/../common/fdlibm.h

View File

@ -9,6 +9,7 @@ Two definitions from @file{math.h} are of particular interest.
@item
The representation of infinity as a @code{double} is defined as
@code{HUGE_VAL}; this number is returned on overflow by many functions.
The macro @code{HUGE_VALF} is a corresponding value for @code{float}.
@item
The structure @code{exception} is used when you write customized error
@ -44,43 +45,59 @@ machines---are available when you include @file{fastmath.h} instead of
* atan:: Arctangent
* atan2:: Arctangent of y/x
* atanh:: Inverse hyperbolic tangent
* jN:: Bessel functions (jN, yN)
* jN:: Bessel functions (jN, yN)
* cbrt:: Cube root
* copysign:: Sign of Y, magnitude of X
* cosh:: Hyperbolic cosine
* erf:: Error function (erf, erfc)
* exp:: Exponential
* expm1:: Exponential of x, - 1
* erf:: Error function (erf, erfc)
* exp:: Exponential, base e
* exp2:: Exponential, base 2
* expm1:: Exponential, base e, of x - 1
* fabs:: Absolute value (magnitude)
* floor:: Floor and ceiling (floor, ceil)
* fdim:: Positive difference
* floor:: Floor and ceiling (floor, ceil)
* fma:: Floating multiply add
* fmax:: Maximum
* fmin:: Minimum
* fmod:: Floating-point remainder (modulo)
* fpclassify:: Floating-point classification macro
* frexp:: Split floating-point number
* gamma:: Logarithmic gamma function
* hypot:: Distance from origin
* ilogb:: Get exponent
* infinity:: Floating infinity
* isnan:: Check type of number
* ldexp:: Load exponent
* isgreater:: Comparison macros
* ldexp:: Scale by a power of 2
* log:: Natural logarithms
* log10:: Base 10 logarithms
* log1p:: Log of 1 + X
* log2:: Base 2 logarithms
* logb:: Get exponent
* lrint:: Round to integer
* lround:: Round to integer, away from zero (lround, llround)
* matherr:: Modifiable math error handler
* modf:: Split fractional and integer parts
* nan:: Floating Not a Number
* nearbyint:: Round to integer
* nextafter:: Get next representable number
* pow:: X to the power Y
* remainder:: remainder of X divided by Y
* scalbn:: scalbn
* remquo:: Remainder and part of quotient
* rint:: Round to integer
* round:: Round to integer, away from zero
* scalbn:: Scale by a power of FLT_RADIX (2)
* signbit:: Does floating-point number have negative sign?
* sin:: Sine or cosine (sin, cos)
* sinh:: Hyperbolic sine
* sqrt:: Positive square root
* tan:: Tangent
* tanh:: Hyperbolic tangent
* trunc:: Round to integer, towards zero
@end menu
@page
@node version
@section Version of library
@section Error Handling
There are four different versions of the math library routines: IEEE,
POSIX, X/Open, or SVID. The version may be selected at runtime by
@ -114,119 +131,89 @@ log: DOMAIN error
The library is set to X/Open mode by default.
@page
@include math/wacos.def
The aforementioned error reporting is the supported Newlib libm error
handling method. However, the majority of the functions are written
so as to produce the floating-point exceptions (e.g. "invalid",
"divide-by-zero") as required by the C and POSIX standards, for
floating-point implementations that support them. Newlib does not provide
the floating-point exception access routines defined in the standards
for fenv.h, though, which is why they are considered unsupported. It is
mentioned in case you have separately-provided access routines so that
you are aware that they can be caused.
@page
@include math/wacosh.def
@section Standards Compliance And Portability
Most of the individual function descriptions describe the standards to which
each function complies. However, these descriptions are mostly out of date,
having been written before C99 was released. One of these days we'll get
around to updating the rest of them. (If you'd like to help, please let us
know.)
@page
@include math/wasin.def
``C99'' refers to ISO/IEC 9899:1999, ``Programming languages--C''.
``POSIX'' refers to IEEE Standard 1003.1. POSIX@registeredsymbol{} is a
registered trademark of The IEEE.
@page
@include math/sasinh.def
@c To sort the include list easily, keep the indentation right because want to
@c skip the s_|w_ at the start of most--but not all--of the file names.
@c (e.g., isgreater.def does not have a leading s nor w.) Then, sort
@c based on the column. For example: "sort -t@ -k3.17"
@c A few hand-edits might be appropriate after a sort, although not necessary
@c and are a nuisance as ought to be kept in sync with menu list above:
@c atan2 after atan, exp2 after exp, log first in log list, and w_j0 to place
@c to reflect function name of Bessel (as opposed to j; e.g. after atanh,
@c before cbrt).
@page
@include math/satan.def
@page
@include math/watan2.def
@page
@include math/watanh.def
@page
@include math/wj0.def
@page
@include common/scbrt.def
@page
@include common/scopysign.def
@page
@include math/wcosh.def
@page
@include math/serf.def
@page
@include math/wexp.def
@page
@include common/sexpm1.def
@page
@include math/sfabs.def
@page
@include math/sfloor.def
@page
@include math/wfmod.def
@page
@include math/sfrexp.def
@page
@include math/wgamma.def
@page
@include math/whypot.def
@page
@include common/silogb.def
@page
@include common/sinfinity.def
@page
@include common/sisnan.def
@page
@include math/sldexp.def
@page
@include math/wlog.def
@page
@include math/wlog10.def
@page
@include common/slog1p.def
@page
@include common/smatherr.def
@page
@include common/smodf.def
@page
@include common/snan.def
@page
@include common/snextafter.def
@page
@include math/wpow.def
@page
@include math/wremainder.def
@page
@include common/sscalbn.def
@page
@include math/wsqrt.def
@page
@include math/ssin.def
@page
@include math/wsinh.def
@page
@include math/stan.def
@page
@include math/stanh.def
@page @include math/w_acos.def
@page @include math/w_acosh.def
@page @include math/w_asin.def
@page @include math/s_asinh.def
@page @include math/s_atan.def
@page @include math/w_atan2.def
@page @include math/w_atanh.def
@page @include math/w_j0.def
@page @include common/s_cbrt.def
@page @include common/s_copysign.def
@page @include math/w_cosh.def
@page @include math/s_erf.def
@page @include math/w_exp.def
@page @include math/w_exp2.def
@page @include common/s_expm1.def
@page @include math/s_fabs.def
@page @include common/s_fdim.def
@page @include math/s_floor.def
@page @include common/s_fma.def
@page @include common/s_fmax.def
@page @include common/s_fmin.def
@page @include math/w_fmod.def
@page @include math/s_frexp.def
@page @include math/w_gamma.def
@page @include math/w_hypot.def
@page @include common/s_ilogb.def
@page @include common/s_infinity.def
@page @include common/isgreater.def
@page @include common/s_isnan.def
@page @include math/s_ldexp.def
@page @include math/w_log.def
@page @include math/w_log10.def
@page @include common/s_log1p.def
@page @include common/s_log2.def
@page @include common/s_logb.def
@page @include common/s_lrint.def
@page @include common/s_lround.def
@page @include common/s_matherr.def
@page @include common/s_modf.def
@page @include common/s_nan.def
@page @include common/s_nearbyint.def
@page @include common/s_nextafter.def
@page @include math/w_pow.def
@page @include math/w_remainder.def
@page @include common/s_remquo.def
@page @include common/s_rint.def
@page @include common/s_round.def
@page @include common/s_scalbn.def
@page @include common/s_signbit.def
@page @include math/s_sin.def
@page @include math/w_sinh.def
@page @include math/w_sqrt.def
@page @include math/s_tan.def
@page @include math/s_tanh.def
@page @include common/s_trunc.def

View File

@ -13,7 +13,7 @@
/*
FUNCTION
<<exp2>>, <<exp2f>>---exponential
<<exp2>>, <<exp2f>>--exponential, base 2
INDEX
exp2
INDEX
@ -24,14 +24,6 @@ ANSI_SYNOPSIS
double exp2(double <[x]>);
float exp2f(float <[x]>);
TRAD_SYNOPSIS
#include <math.h>
double exp2(<[x]>);
double <[x]>;
float exp2f(<[x]>);
float <[x]>;
DESCRIPTION
<<exp2>> and <<exp2f>> calculate 2 ^ <[x]>, that is,
@ifnottex
@ -50,6 +42,9 @@ RETURNS
result overflows, the returned value is <<HUGE_VAL>>. In
either case, <<errno>> is set to <<ERANGE>>.
PORTABILITY
ANSI C, POSIX.
*/
/*

View File

@ -12,11 +12,20 @@
*
*/
/* BUG: FIXME?
According to Linux man pages for tgamma, lgamma, and gamma, the gamma
function was originally defined in BSD as implemented here--the log of the gamma
function. BSD 4.3 changed the name to lgamma, apparently removing gamma. BSD
4.4 re-introduced the gamma name with the more intuitive, without logarithm,
plain gamma function. The C99 standard apparently wanted to avoid a problem
with the poorly-named earlier gamma and used tgamma when adding a plain
gamma function.
So the current gamma is matching an old, bad definition, and not
matching a newer, better definition. */
/*
FUNCTION
<<gamma>>, <<gammaf>>, <<lgamma>>, <<lgammaf>>, <<gamma_r>>,
<<gammaf_r>>, <<lgamma_r>>, <<lgammaf_r>>---logarithmic gamma
function
<<gamma>>, <<gammaf>>, <<lgamma>>, <<lgammaf>>, <<gamma_r>>, <<gammaf_r>>, <<lgamma_r>>, <<lgammaf_r>>, <<tgamma>>, and <<tgammaf>>--logarithmic and plain gamma functions
INDEX
gamma
INDEX
@ -33,6 +42,10 @@ INDEX
lgamma_r
INDEX
lgammaf_r
INDEX
tgamma
INDEX
tgammaf
ANSI_SYNOPSIS
#include <math.h>
@ -44,6 +57,8 @@ double gamma_r(double <[x]>, int *<[signgamp]>);
float gammaf_r(float <[x]>, int *<[signgamp]>);
double lgamma_r(double <[x]>, int *<[signgamp]>);
float lgammaf_r(float <[x]>, int *<[signgamp]>);
double tgamma(double <[x]>);
float tgammaf(float <[x]>);
TRAD_SYNOPSIS
#include <math.h>
@ -67,15 +82,19 @@ int <[signgamp]>;
float lgammaf_r(<[x]>, <[signgamp]>)
float <[x]>;
int <[signgamp]>;
double tgamma(<[x]>)
double <[x]>;
float tgammaf(<[x]>)
float <[x]>;
DESCRIPTION
<<gamma>> calculates
<<gamma>> calculates
@tex
$\mit ln\bigl(\Gamma(x)\bigr)$,
$\mit ln\bigl(\Gamma(x)\bigr)$,
@end tex
the natural logarithm of the gamma function of <[x]>. The gamma function
(<<exp(gamma(<[x]>))>>) is a generalization of factorial, and retains
the property that
the property that
@ifnottex
<<exp(gamma(N))>> is equivalent to <<N*exp(gamma(N-1))>>.
@end ifnottex
@ -83,13 +102,13 @@ the property that
$\mit \Gamma(N)\equiv N\times\Gamma(N-1)$.
@end tex
Accordingly, the results of the gamma function itself grow very
quickly. <<gamma>> is defined as
quickly. <<gamma>> is defined as
@tex
$\mit ln\bigl(\Gamma(x)\bigr)$ rather than simply $\mit \Gamma(x)$
@end tex
@ifnottex
the natural log of the gamma function, rather than the gamma function
itself,
itself,
@end ifnottex
to extend the useful range of results representable.
@ -113,8 +132,17 @@ variable <<signgam>> is not used. These functions may be used for
reentrant calls (but they will still set the global variable <<errno>>
if an error occurs).
<<tgamma>> and <<tgammaf>> are the "true gamma" functions, returning
@tex
$\mit \Gamma(x)$,
@end tex
the gamma function of <[x]>--without a logarithm.
(They are apparently so named because of the prior existence of the old,
poorly-named <<gamma>> functions which returned the log of gamma up
through BSD 4.2.)
RETURNS
Normally, the computed result is returned.
Normally, the computed result is returned.
When <[x]> is a nonpositive integer, <<gamma>> returns <<HUGE_VAL>>
and <<errno>> is set to <<EDOM>>. If the result overflows, <<gamma>>
@ -123,7 +151,12 @@ returns <<HUGE_VAL>> and <<errno>> is set to <<ERANGE>>.
You can modify this error treatment using <<matherr>>.
PORTABILITY
Neither <<gamma>> nor <<gammaf>> is ANSI C. */
Neither <<gamma>> nor <<gammaf>> is ANSI C. It is better not to use either
of these; use <<lgamma>> or <<tgamma>> instead.@*
<<lgamma>>, <<lgammaf>>, <<tgamma>>, and <<tgammaf>> are nominally C standard
in terms of the base return values, although the <<matherr>> error-handling
is not standard, nor is the <[signgam]> global for <<lgamma>>.
*/
/* double gamma(double x)
* Return the logarithm of the Gamma function of x.