1997-04-21 13:25  Ulrich Drepper  <drepper@cygnus.com>

	* manual/arith.texi: Add description for INFINITY, _Imaginary_I,
	fpclassify & friends, and complex number operations.
	Update various other math functions for ISO C 9X.
	* manual/math.texi: Update various entries for ISO C 9X.
	Add description for complex number functions.
	Add description of rand48 function family.
	* manual/string.h: Add description of a64l and l64a.

	* math/cmathcalls.h: Fix typo.

	* stdlib/a64l.c: Pretty printing.

	* stdlib/seed48_r.c: Also reset `a' and `c' to default values.
	* stdlib/srand48_r.c: Likewise.
	* stdlib/stdlib.h: Pretty printing.

	* sysdeps/i386/fpu/__math.h: Fix typo.

	* sysdeps/libm-ieee754/s_nearbyintf.c: Correctly name function.
	* sysdeps/libm-ieee754/s_nearbyintl.c: Likewise.

1997-04-19 22:16  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/e_pow.c: Rewrite handling of integral exponent.

1997-04-18 19:34  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/__math.h: Define optimized versions of
	isgreater, isgreaterequal, isless, islessequal, islessgreater, and
	isunordered.

1997-04-20 01:28  Richard Henderson  <rth@tamu.edu>

	* rellns-sh: Handle files in the same directory correctly.

1997-04-20 11:22  Ulrich Drepper  <drepper@cygnus.com>

	* csu/initfini.c: Place ALIGN instruction at correct positions.
	Patch by Richard Henderson <richard@twiddle.rth.home>.

1997-04-19 17:12  Ulrich Drepper  <drepper@cygnus.com>

	* Make-dist: Don't automatically ignore .c files if the .S or .s file
	is ignored.

	* csu/Makefile (distribute): Add defs.awk.

1997-04-19 15:39  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/stub/shmat.c: Update to XPG4.2 interface.
	* sysdeps/stub/shmdt.c: Likewise.
	Reported by Thomas Bushnell, n/BSG.

1997-04-19 13:22  Ulrich Drepper  <drepper@cygnus.com>

	* manual/stdio.texi: Add description of printf_size and
	printf_size_info.  Partly based on the documentation by Larry McVoy.

1997-04-19 02:21  Ulrich Drepper  <drepper@cygnus.com>

	* stdio-common/printf_size.c (printf_size): Correct values for
	`units'.
	Report by Larry McVoy <lm@neteng.engr.sgi.com>.
	* stdio-common/tst-printfsz.c: New file.
	* stdio-common/Makefile (tests): Add tst-printfsz.c.
	(CFLAGS-tst-printfsz.c): Define to prevent warnings about format
	strings.

1997-04-18 15:48  Ulrich Drepper  <drepper@cygnus.com>

	* login/utmp.h: Add prototype for updwtmp.
	* login/logwtmp.c: Add new function updwtmp which allows to write
	a complete record to the wtmp file.
	Patch by Miquel van Smoorenburg <miquels@cistron.nl>.

1997-04-17 17:57  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* math/Makefile (headers): Add mathbits.h.

1997-04-16 21:20  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/__math.h: Add inlined sincos{,l,f}.
	* sysdeps/m68k/fpu/s_sincos.c: New file.
	* sysdeps/m68k/fpu/s_sincosf.c: New file.
	* sysdeps/m68k/fpu/s_sincosl.c: New file.

	* sysdeps/libm-ieee754/e_scalb.c: Use internal names of the
	functions.
	* sysdeps/libm-ieee754/e_scalbl.c: Likewise.

	* sysdeps/libm-ieee754/s_ctanh.c: Use isfinite instead of finite.
	* sysdeps/libm-ieee754/s_ctanhf.c: Likewise.
	* sysdeps/libm-ieee754/s_ctanhl.c: Likewise.
	* sysdeps/libm-ieee754/s_ctan.c: Likewise.
	* sysdeps/libm-ieee754/s_ctanf.c: Likewise.
	* sysdeps/libm-ieee754/s_ctanl.c: Likewise.  Fix type of `res'.

1997-04-18 11:21  Ulrich Drepper  <drepper@cygnus.com>

	* shadow/fgetspent_r.c: Set *RESULT to NULL before returning error.
	Patch by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>.
This commit is contained in:
Ulrich Drepper 1997-04-21 11:38:46 +00:00
parent 406f977a5a
commit b4012b7542
36 changed files with 1670 additions and 238 deletions

104
ChangeLog
View File

@ -1,3 +1,107 @@
1997-04-21 13:25 Ulrich Drepper <drepper@cygnus.com>
* manual/arith.texi: Add description for INFINITY, _Imaginary_I,
fpclassify & friends, and complex number operations.
Update various other math functions for ISO C 9X.
* manual/math.texi: Update various entries for ISO C 9X.
Add description for complex number functions.
Add description of rand48 function family.
* manual/string.h: Add description of a64l and l64a.
* math/cmathcalls.h: Fix typo.
* stdlib/a64l.c: Pretty printing.
* stdlib/seed48_r.c: Also reset `a' and `c' to default values.
* stdlib/srand48_r.c: Likewise.
* stdlib/stdlib.h: Pretty printing.
* sysdeps/i386/fpu/__math.h: Fix typo.
* sysdeps/libm-ieee754/s_nearbyintf.c: Correctly name function.
* sysdeps/libm-ieee754/s_nearbyintl.c: Likewise.
1997-04-19 22:16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/e_pow.c: Rewrite handling of integral exponent.
1997-04-18 19:34 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/__math.h: Define optimized versions of
isgreater, isgreaterequal, isless, islessequal, islessgreater, and
isunordered.
1997-04-20 01:28 Richard Henderson <rth@tamu.edu>
* rellns-sh: Handle files in the same directory correctly.
1997-04-20 11:22 Ulrich Drepper <drepper@cygnus.com>
* csu/initfini.c: Place ALIGN instruction at correct positions.
Patch by Richard Henderson <richard@twiddle.rth.home>.
1997-04-19 17:12 Ulrich Drepper <drepper@cygnus.com>
* Make-dist: Don't automatically ignore .c files if the .S or .s file
is ignored.
* csu/Makefile (distribute): Add defs.awk.
1997-04-19 15:39 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/stub/shmat.c: Update to XPG4.2 interface.
* sysdeps/stub/shmdt.c: Likewise.
Reported by Thomas Bushnell, n/BSG.
1997-04-19 13:22 Ulrich Drepper <drepper@cygnus.com>
* manual/stdio.texi: Add description of printf_size and
printf_size_info. Partly based on the documentation by Larry McVoy.
1997-04-19 02:21 Ulrich Drepper <drepper@cygnus.com>
* stdio-common/printf_size.c (printf_size): Correct values for
`units'.
Report by Larry McVoy <lm@neteng.engr.sgi.com>.
* stdio-common/tst-printfsz.c: New file.
* stdio-common/Makefile (tests): Add tst-printfsz.c.
(CFLAGS-tst-printfsz.c): Define to prevent warnings about format
strings.
1997-04-18 15:48 Ulrich Drepper <drepper@cygnus.com>
* login/utmp.h: Add prototype for updwtmp.
* login/logwtmp.c: Add new function updwtmp which allows to write
a complete record to the wtmp file.
Patch by Miquel van Smoorenburg <miquels@cistron.nl>.
1997-04-17 17:57 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* math/Makefile (headers): Add mathbits.h.
1997-04-16 21:20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/fpu/__math.h: Add inlined sincos{,l,f}.
* sysdeps/m68k/fpu/s_sincos.c: New file.
* sysdeps/m68k/fpu/s_sincosf.c: New file.
* sysdeps/m68k/fpu/s_sincosl.c: New file.
* sysdeps/libm-ieee754/e_scalb.c: Use internal names of the
functions.
* sysdeps/libm-ieee754/e_scalbl.c: Likewise.
* sysdeps/libm-ieee754/s_ctanh.c: Use isfinite instead of finite.
* sysdeps/libm-ieee754/s_ctanhf.c: Likewise.
* sysdeps/libm-ieee754/s_ctanhl.c: Likewise.
* sysdeps/libm-ieee754/s_ctan.c: Likewise.
* sysdeps/libm-ieee754/s_ctanf.c: Likewise.
* sysdeps/libm-ieee754/s_ctanl.c: Likewise. Fix type of `res'.
1997-04-18 11:21 Ulrich Drepper <drepper@cygnus.com>
* shadow/fgetspent_r.c: Set *RESULT to NULL before returning error.
Patch by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>.
1997-04-18 02:18 Ulrich Drepper <drepper@cygnus.com>
* csu/initfini.c: Rewrite by Zack Weinberg

View File

@ -118,8 +118,8 @@ foo:=$(shell echo '+out=$(+out)' >&2; echo foofoo >&2)
$(+sysdeps)
foo:=$(shell echo 'made +tsrcs=$(+tsrcs)'>&2)
foo:=$(shell echo generated='$(generated)' >&2)
generated := $(sort $(generated) $(generated:.S=.c) $(generated:.s=.c))
foo:=$(shell echo now generated='$(generated)' >&2)
#generated := $(sort $(generated) $(generated:.S=.c) $(generated:.s=.c))
#foo:=$(shell echo now generated='$(generated)' >&2)
+tsrcs := $(sort $(filter-out $(generated),$(+tsrcs)))
foo:=$(shell echo '+tsrcs=$(+tsrcs)'>&2)
foo:=$(shell echo foobie, dammit! >&2)

16
config.guess vendored
View File

@ -70,17 +70,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
arc:OpenBSD:*:*)
arc64:OpenBSD:*:*)
echo mips64el-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
laguna:OpenBSD:*:*)
echo mips64-unknown-openbsd${UNAME_RELEASE}
arc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
hkmips:OpenBSD:*:*)
echo mips-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
pmax:OpenBSD:*:*)
echo mips64el-unknown-openbsd${UNAME_RELEASE}
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sgi:OpenBSD:*:*)
echo mips-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
wgrisc:OpenBSD:*:*)
echo mips64el-unknown-openbsd${UNAME_RELEASE}
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}

View File

@ -76,12 +76,12 @@ _init (void)
if (__gmon_start__)
__gmon_start__ ();
asm ("ALIGN");
asm("END_INIT");
/* Now the epilog. */
asm ("\n/*@_init_PROLOG_ENDS*/");
asm ("\n/*@_init_EPILOG_BEGINS*/");
SECTION(".init");
asm ("ALIGN");
}
asm ("END_INIT");
@ -95,6 +95,7 @@ _fini (void)
{
/* End of the _fini prolog. */
asm ("ALIGN");
asm ("END_FINI");
asm ("\n/*@_fini_PROLOG_ENDS*/");
@ -109,7 +110,6 @@ _fini (void)
/* Beginning of the _fini epilog. */
asm ("\n/*@_fini_EPILOG_BEGINS*/");
SECTION (".fini");
asm ("ALIGN");
}
asm ("END_FINI");
@ -117,6 +117,5 @@ asm ("END_FINI");
is shared between both crt files. */
asm ("\n/*@_fini_EPILOG_ENDS*/");
asm ("\n/*@TRAILER_BEGINS*/");
asm ("ALIGN");
/* End of file. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -25,18 +25,51 @@
#include <sys/stat.h>
void
logwtmp (const char *line, const char *name, const char *host)
updwtmp (const char *wtmp_file, const struct utmp *ut)
{
struct utmp ut;
struct stat st;
size_t written;
int fd;
/* Open WTMP file. */
fd = __open (_PATH_WTMP, O_WRONLY | O_APPEND);
fd = __open (wtmp_file, O_WRONLY | O_APPEND);
if (fd < 0)
return;
/* Try to lock the file. */
if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS)
{
/* Oh, oh. The file is already locked. Wait a bit and try again. */
sleep (1);
/* This time we ignore the error. */
__flock (fd, LOCK_EX | LOCK_NB);
}
/* Remember original size of log file: */
if (__fstat (fd, &st) < 0)
goto done;
/* Write the entry. If we can't write all the bytes, reset the file
size back to the original size. That way, no partial entries
will remain. */
written = __write (fd, ut, sizeof (struct utmp));
if (written > 0 && written != sizeof (struct utmp))
ftruncate (fd, st.st_size);
done:
/* And unlock the file. */
__flock (fd, LOCK_UN);
/* Close WTMP file. */
__close (fd);
}
void
logwtmp (const char *line, const char *name, const char *host)
{
struct utmp ut;
/* Set information in new entry. */
memset (&ut, 0, sizeof (ut));
#if _HAVE_UT_PID - 0
@ -57,31 +90,5 @@ logwtmp (const char *line, const char *name, const char *host)
time (&ut.ut_time);
#endif
/* Try to lock the file. */
if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS)
{
/* Oh, oh. The file is already locked. Wait a bit and try again. */
sleep (1);
/* This time we ignore the error. */
__flock (fd, LOCK_EX | LOCK_NB);
}
/* Remember original size of log file: */
if (__fstat (fd, &st) < 0)
goto done;
/* Write the entry. If we can't write all the bytes, reset the file
size back to the original size. That way, no partial entries
will remain. */
written = __write (fd, &ut, sizeof (ut));
if (written > 0 && written != sizeof (ut))
ftruncate (fd, st.st_size);
done:
/* And unlock the file. */
__flock (fd, LOCK_UN);
/* Close WTMP file. */
__close (fd);
updwtmp(_PATH_WTMP, &ut);
}

View File

@ -49,6 +49,10 @@ extern void login __P ((__const struct utmp *__entry));
/* Write the utmp entry to say the user on UT_LINE has logged out. */
extern int logout __P ((__const char *__ut_line));
/* Append the given entry to a wtmp file. */
extern void updwtmp __P ((__const char *__wtmp_file,
__const struct utmp *__entry));
/* Append to wtmp an entry for the current time and the given info. */
extern void logwtmp __P ((__const char *__ut_line, __const char *__ut_name,
__const char *__ut_host));

View File

@ -3,12 +3,17 @@
This chapter contains information about functions for doing basic
arithmetic operations, such as splitting a float into its integer and
fractional parts. These functions are declared in the header file
@file{math.h}.
fractional parts or retrieving the imaginary part of a complex value.
These functions are declared in the header files @file{math.h} and
@file{complex.h}.
@menu
* Infinity:: What is Infinity and how to test for it.
* Not a Number:: Making NaNs and testing for NaNs.
* Imaginary Unit:: Constructing complex Numbers.
* Predicates on Floats:: Testing for infinity and for NaNs.
* Floating-Point Classes:: Classifiy floating-point numbers.
* Operations on Complex:: Projections, Conjugates, and Decomposing.
* Absolute Value:: Absolute value functions.
* Normalization Functions:: Hacks for radix-2 representations.
* Rounding and Remainders:: Determining the integer and
@ -19,6 +24,44 @@ fractional parts. These functions are declared in the header file
from strings.
@end menu
@node Infinity
@section Infinity Values
@cindex Infinity
@cindex IEEE floating point
Mathematical operations easily can produce as the result values which
are not representable by the floating-point format. The functions in
the mathematics library also have this problem. The situation is
generally solved by raising an overflow exception and by returning a
huge value.
The @w{IEEE 754} floating-point defines a special value to be used in
these situations. There is a special value for infinity.
@comment math.h
@comment ISO
@deftypevr Macro float_t INFINITY
A expression representing the inifite value. @code{INFINITY} values are
produce by mathematical operations like @code{1.0 / 0.0}. It is
possible to continue the computations with this value since the basic
operations as well as the mathematical library functions are prepared to
handle values like this.
Beside @code{INFINITY} also the value @code{-INIFITY} is representable
and it is handled differently if needed. It is possible to test a
variables for infinite value using a simple comparison but the
recommended way is to use the the @code{isinf} function.
This macro was introduced in the @w{ISO C 9X} standard.
@end deftypevr
@vindex HUGE_VAL
The macros @code{HUGE_VAL}, @code{HUGE_VALF} and @code{HUGE_VALL} are
defined in a similar way but they are not required to represent the
infinite value, only a very large value (@pxref{Domain and Range Errors}).
If actually infinity is wanted, @code{INFINITY} should be used.
@node Not a Number
@section ``Not a Number'' Values
@cindex NaN
@ -54,6 +97,46 @@ such as by defining @code{_GNU_SOURCE}, and then you must include
@file{math.h}.)
@end deftypevr
@node Imaginary Unit
@section Constructing complex Numbers
@pindex complex.h
To construct complex numbers it is necessary have a way to express the
imaginary part of the numbers. In mathematics one uses the symbol ``i''
to mark a number as imaginary. For convenienve the @file{complex.h}
header defines two macros which allow to use a similar easy notation.
@deftypevr Macro float_t _Imaginary_I
This macro is a (compiler specific) representation of the value ``1i''.
I.e., it is the value for which
@smallexample
_Imaginary_I * _Imaginary_I = -1
@end smallexample
@noindent
One can use it to easily construct complex number like in
@smallexample
3.0 - _Imaginary_I * 4.0
@end smallexample
@noindent
which results in the complex number with a real part of 3.0 and a
imaginary part -4.0.
@end deftypevr
@noindent
A more intuitive approach is to use the following macro.
@deftypevr Macro float_t I
This macro has exactly the same value as @code{_Imaginary_I}. The
problem is that the name @code{I} very easily can clash with macros or
variables in programs and so it might be a good idea to avoid this name
and stay at the safe side by using @code{_Imaginary_I}.
@end deftypevr
@node Predicates on Floats
@section Predicates on Floats
@ -66,6 +149,10 @@ functions, and thus are available if you define @code{_BSD_SOURCE} or
@comment math.h
@comment BSD
@deftypefun int isinf (double @var{x})
@end deftypefun
@deftypefun int isinff (float @var{x})
@end deftypefun
@deftypefun int isinfl (long double @var{x})
This function returns @code{-1} if @var{x} represents negative infinity,
@code{1} if @var{x} represents positive infinity, and @code{0} otherwise.
@end deftypefun
@ -73,6 +160,10 @@ This function returns @code{-1} if @var{x} represents negative infinity,
@comment math.h
@comment BSD
@deftypefun int isnan (double @var{x})
@end deftypefun
@deftypefun int isnanf (float @var{x})
@end deftypefun
@deftypefun int isnanl (long double @var{x})
This function returns a nonzero value if @var{x} is a ``not a number''
value, and zero otherwise. (You can just as well use @code{@var{x} !=
@var{x}} to get the same result).
@ -81,6 +172,10 @@ value, and zero otherwise. (You can just as well use @code{@var{x} !=
@comment math.h
@comment BSD
@deftypefun int finite (double @var{x})
@end deftypefun
@deftypefun int finitef (float @var{x})
@end deftypefun
@deftypefun int finitel (long double @var{x})
This function returns a nonzero value if @var{x} is finite or a ``not a
number'' value, and zero otherwise.
@end deftypefun
@ -103,6 +198,189 @@ does not fit the @w{ISO C} specification.
@strong{Portability Note:} The functions listed in this section are BSD
extensions.
@node Floating-Point Classes
@section Floating-Point Number Classification Functions
Instead of using the BSD specific functions from the last section it is
better to use those in this section will are introduced in the @w{ISO C
9X} standard and are therefore widely available.
@comment math.h
@comment ISO
@deftypefun int fpclassify (@emph{float-type} @var{x})
This is a generic macro which works on all floating-point types and
which returns a value of type @code{int}. The possible values are:
@vtable @code
@item FP_NAN
The floating-point number @var{x} is ``Not a Number'' (@pxref{Not a Number})
@item FP_INFINITE
The value of @var{x} is either plus or minus infinity (@pxref{Infinity})
@item FP_ZERO
The value of @var{x} is zero. In floating-point formats like @w{IEEE
754} where the zero value can be signed this value is also returned if
@var{x} is minus zero.
@item FP_SUBNORMAL
Some floating-point formats (such as @w{IEEE 754}) allow floating-point
numbers to be represented in a denormalized format. This happens if the
absolute value of the number is too small to be represented in the
normal format. @code{FP_SUBNORMAL} is returned for such values of @var{x}.
@item FP_NORMAL
This value is returned for all other cases which means the number is a
plain floating-point number without special meaning.
@end vtable
This macro is useful if more than property of a number must be
tested. If one only has to test for, e.g., a NaN value, there are
function which are faster.
@end deftypefun
The remainder of this section introduces some more specific functions.
They might be implemented faster than the call to @code{fpclassify} and
if the actual need in the program is covered be these functions they
should be used (and not @code{fpclassify}).
@comment math.h
@comment ISO
@deftypefun int isfinite (@emph{float-type} @var{x})
The value returned by this macro is nonzero if the value of @var{x} is
not plus or minus infinity and not NaN. I.e., it could be implemented as
@smallexample
(fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)
@end smallexample
@code{isfinite} is also implemented as a macro which can handle all
floating-point types. Programs should use this function instead of
@var{finite} (@pxref{Predicates on Floats}).
@end deftypefun
@comment math.h
@comment ISO
@deftypefun int isnormal (@emph{float-type} @var{x})
If @code{isnormal} returns a nonzero value the value or @var{x} is
neither a NaN, infinity, zero, nor a denormalized number. I.e., it
could be implemented as
@smallexample
(fpclassify (x) == FP_NORMAL)
@end smallexample
@end deftypefun
@comment math.h
@comment ISO
@deftypefun int isnan (@emph{float-type} @var{x})
The situation with this macro is a bit complicated. Here @code{isnan}
is a macro which can handle all kinds of floating-point types. It
returns a nonzero value is @var{x} does not represent a NaN value and
could be written like this
@smallexample
(fpclassify (x) == FP_NAN)
@end smallexample
The complication is that there is a function of the same name and the
same semantic defined for compatibility with BSD (@pxref{Predicates on
Floats}). Fortunately this should not yield to problems in most cases
since the macro and the function have the same semantic. Should in a
situation the function be absolutely necessary one can use
@smallexample
(isnan) (x)
@end smallexample
@noindent
to avoid the macro expansion. Using the macro has two big adavantages:
it is more portable and one does not have to choose the right function
among @code{isnan}, @code{isnanf}, and @code{isnanl}.
@end deftypefun
@node Operations on Complex
@section Projections, Conjugates, and Decomposing of Complex Numbers
@cindex project complex numbers
@cindex conjugate complex numbers
@cindex decompose complex numbers
This section lists functions performing some of the simple mathematical
operations on complex numbers. Using any of the function requries that
the C compiler understands the @code{complex} keyword, introduced to the
C language in the @w{ISO C 9X} standard.
@pindex complex.h
The prototypes for all functions in this section can be found in
@file{complex.h}. All functions are available in three variants, one
for each of the three floating-point types.
The easiest operation on complex numbers is the decomposition in the
real part and the imaginary part. This is done by the next two
functions.
@comment complex.h
@comment ISO
@deftypefun double creal (complex double @var{z})
@end deftypefun
@deftypefun float crealf (complex float @var{z})
@end deftypefun
@deftypefun {long double} creall (complex long double @var{z})
These functions return the real part of the complex number @var{z}.
@end deftypefun
@comment complex.h
@comment ISO
@deftypefun double cimag (complex double @var{z})
@end deftypefun
@deftypefun float cimagf (complex float @var{z})
@end deftypefun
@deftypefun {long double} cimagl (complex long double @var{z})
These functions return the imaginary part of the complex number @var{z}.
@end deftypefun
The conjugate complex value of a given complex number has the same value
for the real part but the complex part is negated.
@comment complex.h
@comment ISO
@deftypefun {complex double} conj (complex double @var{z})
@end deftypefun
@deftypefun {complex float} conjf (complex float @var{z})
@end deftypefun
@deftypefun {complex long double} conjl (complex long double @var{z})
These functions return the conjugate complex value of the complex number
@var{z}.
@end deftypefun
@comment complex.h
@comment ISO
@deftypefun double carg (complex double @var{z})
@end deftypefun
@deftypefun float cargf (complex float @var{z})
@end deftypefun
@deftypefun {long double} cargl (complex long double @var{z})
These functions return argument of the complex number @var{z}.
Mathematically, the argument is the phase angle of @var{z} with a branch
cut along the negative real axis.
@end deftypefun
@comment complex.h
@comment ISO
@deftypefun {complex double} cproj (complex double @var{z})
@end deftypefun
@deftypefun {complex float} cprojf (complex float @var{z})
@end deftypefun
@deftypefun {complex long double} cprojl (complex long double @var{z})
Return the projection of the complex value @var{z} on the Riemann
sphere. Values with a infinite complex part (even if the real part
is NaN) are projected to positive infinte on the real axis. If the real part is infinite, the result is equivalent to
@smallexample
INFINITY + I * copysign (0.0, cimag (z))
@end smallexample
@end deftypefun
@node Absolute Value
@section Absolute Value
@cindex absolute value functions
@ -117,7 +395,8 @@ whose imaginary part is @var{y}, the absolute value is @w{@code{sqrt
@pindex math.h
@pindex stdlib.h
Prototypes for @code{abs} and @code{labs} are in @file{stdlib.h};
@code{fabs} and @code{cabs} are declared in @file{math.h}.
@code{fabs}, @code{fabsf} and @code{fabsl} are declared in @file{math.h};
@code{cabs}, @code{cabsf} and @code{cabsl} are declared in @file{complex.h}.
@comment stdlib.h
@comment ISO
@ -139,20 +418,28 @@ are of type @code{long int} rather than @code{int}.
@comment math.h
@comment ISO
@deftypefun double fabs (double @var{number})
@end deftypefun
@deftypefun float fabsf (float @var{number})
@end deftypefun
@deftypefun {long double} fabsl (long double @var{number})
This function returns the absolute value of the floating-point number
@var{number}.
@end deftypefun
@comment math.h
@comment BSD
@deftypefun double cabs (struct @{ double real, imag; @} @var{z})
The @code{cabs} function returns the absolute value of the complex
number @var{z}, whose real part is @code{@var{z}.real} and whose
imaginary part is @code{@var{z}.imag}. (See also the function
@code{hypot} in @ref{Exponents and Logarithms}.) The value is:
@comment complex.h
@comment ISO
@deftypefun double cabs (complex double @var{z})
@end deftypefun
@deftypefun float cabsf (complex float @var{z})
@end deftypefun
@deftypefun {long double} cabsl (complex long double @var{z})
These functions return the absolute value of the complex number @var{z}.
The compiler must support complex numbers to use these functions. (See
also the function @code{hypot} in @ref{Exponents and Logarithms}.) The
value is:
@smallexample
sqrt (@var{z}.real*@var{z}.real + @var{z}.imag*@var{z}.imag)
sqrt (creal (@var{z}) * creal (@var{z}) + cimag (@var{z}) * cimag (@var{z}))
@end smallexample
@end deftypefun
@ -174,7 +461,11 @@ All these functions are declared in @file{math.h}.
@comment math.h
@comment ISO
@deftypefun double frexp (double @var{value}, int *@var{exponent})
The @code{frexp} function is used to split the number @var{value}
@end deftypefun
@deftypefun float frexpf (float @var{value}, int *@var{exponent})
@end deftypefun
@deftypefun {long double} frexpl (long double @var{value}, int *@var{exponent})
These functions are used to split the number @var{value}
into a normalized fraction and an exponent.
If the argument @var{value} is not zero, the return value is @var{value}
@ -193,7 +484,11 @@ zero is stored in @code{*@var{exponent}}.
@comment math.h
@comment ISO
@deftypefun double ldexp (double @var{value}, int @var{exponent})
This function returns the result of multiplying the floating-point
@end deftypefun
@deftypefun float ldexpf (float @var{value}, int @var{exponent})
@end deftypefun
@deftypefun {long double} ldexpl (long double @var{value}, int @var{exponent})
These functions return the result of multiplying the floating-point
number @var{value} by 2 raised to the power @var{exponent}. (It can
be used to reassemble floating-point numbers that were taken apart
by @code{frexp}.)
@ -207,13 +502,21 @@ equivalent to those of @code{ldexp} and @code{frexp}:
@comment math.h
@comment BSD
@deftypefun double scalb (double @var{value}, int @var{exponent})
@end deftypefun
@deftypefun float scalbf (float @var{value}, int @var{exponent})
@end deftypefun
@deftypefun {long double} scalbl (long double @var{value}, int @var{exponent})
The @code{scalb} function is the BSD name for @code{ldexp}.
@end deftypefun
@comment math.h
@comment BSD
@deftypefun double logb (double @var{x})
This BSD function returns the integer part of the base-2 logarithm of
@end deftypefun
@deftypefun float logbf (float @var{x})
@end deftypefun
@deftypefun {long double} logbl (long double @var{x})
These BSD functions return the integer part of the base-2 logarithm of
@var{x}, an integer value represented in type @code{double}. This is
the highest integer power of @code{2} contained in @var{x}. The sign of
@var{x} is ignored. For example, @code{logb (3.5)} is @code{1.0} and
@ -231,11 +534,28 @@ The value returned by @code{logb} is one less than the value that
@end deftypefun
@comment math.h
@comment BSD
@comment ISO
@deftypefun double copysign (double @var{value}, double @var{sign})
The @code{copysign} function returns a value whose absolute value is the
@end deftypefun
@deftypefun float copysignf (float @var{value}, float @var{sign})
@end deftypefun
@deftypefun {long double} copysignl (long double @var{value}, long double @var{sign})
These functions return a value whose absolute value is the
same as that of @var{value}, and whose sign matches that of @var{sign}.
This is a BSD function.
This function appears in BSD and was standardized in @w{ISO C 9X}.
@end deftypefun
@comment math.h
@comment ISO
@deftypefun int signbit (@emph{float-type} @var{x})
@code{signbit} is a generic macro which can work on all floating-point
types. It returns a nonzero value if the value of @var{x} has its sign
bit set.
This is not the same as @code{x < 0.0} since in some floating-point
formats (e.g., @w{IEEE 754}) the zero value is optionally signed. The
comparison @code{-0.0 < 0.0} will not be true while @code{signbit
(-0.0)} will return a nonzeri value.
@end deftypefun
@node Rounding and Remainders
@ -260,7 +580,11 @@ result as a @code{double} instead to get around this problem.
@comment math.h
@comment ISO
@deftypefun double ceil (double @var{x})
The @code{ceil} function rounds @var{x} upwards to the nearest integer,
@end deftypefun
@deftypefun float ceilf (float @var{x})
@end deftypefun
@deftypefun {long double} ceill (long double @var{x})
These functions round @var{x} upwards to the nearest integer,
returning that value as a @code{double}. Thus, @code{ceil (1.5)}
is @code{2.0}.
@end deftypefun
@ -268,15 +592,23 @@ is @code{2.0}.
@comment math.h
@comment ISO
@deftypefun double floor (double @var{x})
The @code{ceil} function rounds @var{x} downwards to the nearest
@end deftypefun
@deftypefun float floorf (float @var{x})
@end deftypefun
@deftypefun {long double} floorl (long double @var{x})
These functions round @var{x} downwards to the nearest
integer, returning that value as a @code{double}. Thus, @code{floor
(1.5)} is @code{1.0} and @code{floor (-1.5)} is @code{-2.0}.
@end deftypefun
@comment math.h
@comment BSD
@comment ISO
@deftypefun double rint (double @var{x})
This function rounds @var{x} to an integer value according to the
@end deftypefun
@deftypefun float rintf (float @var{x})
@end deftypefun
@deftypefun {long double} rintl (long double @var{x})
These functions round @var{x} to an integer value according to the
current rounding mode. @xref{Floating Point Parameters}, for
information about the various rounding modes. The default
rounding mode is to round to the nearest integer; some machines
@ -284,10 +616,26 @@ support other modes, but round-to-nearest is always used unless
you explicit select another.
@end deftypefun
@comment math.h
@comment ISO
@deftypefun double nearbyint (double @var{x})
@end deftypefun
@deftypefun float nearbyintf (float @var{x})
@end deftypefun
@deftypefun {long double} nearbyintl (long double @var{x})
These functions return the same value as the @code{rint} functions but
even some rounding actually takes place @code{nearbyint} does @emph{not}
raise the inexact exception.
@end deftypefun
@comment math.h
@comment ISO
@deftypefun double modf (double @var{value}, double *@var{integer-part})
This function breaks the argument @var{value} into an integer part and a
@end deftypefun
@deftypefun float modff (flaot @var{value}, float *@var{integer-part})
@end deftypefun
@deftypefun {long double} modfl (long double @var{value}, long double *@var{integer-part})
These functions break the argument @var{value} into an integer part and a
fractional part (between @code{-1} and @code{1}, exclusive). Their sum
equals @var{value}. Each of the parts has the same sign as @var{value},
so the rounding of the integer part is towards zero.
@ -300,7 +648,11 @@ returns @code{0.5} and stores @code{2.0} into @code{intpart}.
@comment math.h
@comment ISO
@deftypefun double fmod (double @var{numerator}, double @var{denominator})
This function computes the remainder from the division of
@end deftypefun
@deftypefun float fmodf (float @var{numerator}, float @var{denominator})
@end deftypefun
@deftypefun {long double} fmodl (long double @var{numerator}, long double @var{denominator})
These functions compute the remainder from the division of
@var{numerator} by @var{denominator}. Specifically, the return value is
@code{@var{numerator} - @w{@var{n} * @var{denominator}}}, where @var{n}
is the quotient of @var{numerator} divided by @var{denominator}, rounded
@ -317,7 +669,11 @@ If @var{denominator} is zero, @code{fmod} fails and sets @code{errno} to
@comment math.h
@comment BSD
@deftypefun double drem (double @var{numerator}, double @var{denominator})
The function @code{drem} is like @code{fmod} except that it rounds the
@end deftypefun
@deftypefun float dremf (float @var{numerator}, float @var{denominator})
@end deftypefun
@deftypefun {long double} dreml (long double @var{numerator}, long double @var{denominator})
These functions are like @code{fmod} etc except that it rounds the
internal quotient @var{n} to the nearest integer instead of towards zero
to an integer. For example, @code{drem (6.5, 2.3)} returns @code{-0.4},
which is @code{6.5} minus @code{6.9}.

File diff suppressed because it is too large Load Diff

View File

@ -32,9 +32,10 @@ too.
* Search Functions:: Searching for a specific element or substring.
* Finding Tokens in a String:: Splitting a string into tokens by looking
for delimiters.
* Encode Binary Data:: Encoding and Decoding of Binary Data.
@end menu
@node Representation of Strings, String/Array Conventions, , String and Array Utilities
@node Representation of Strings
@section Representation of Strings
@cindex string, representation of
@ -99,7 +100,7 @@ checks for overflowing the array. Many of the library functions
an extra byte to hold the null character that marks the end of the
string.
@node String/Array Conventions, String Length, Representation of Strings, String and Array Utilities
@node String/Array Conventions
@section String and Array Conventions
This chapter describes both functions that work on arbitrary arrays or
@ -132,7 +133,7 @@ other hand, when you are manipulating null-terminated strings it is
usually more convenient to use the @samp{str} functions, unless you
already know the length of the string in advance.
@node String Length, Copying and Concatenation, String/Array Conventions, String and Array Utilities
@node String Length
@section String Length
You can get the length of a string using the @code{strlen} function.
@ -166,7 +167,7 @@ strlen (string)
@end smallexample
@end deftypefun
@node Copying and Concatenation, String/Array Comparison, String Length, String and Array Utilities
@node Copying and Concatenation
@section Copying and Concatenation
You can use the functions described in this section to copy the contents
@ -470,7 +471,7 @@ BSD. Note that it is not as general as @code{memset}, because the only
value it can store is zero.
@end deftypefun
@node String/Array Comparison, Collation Functions, Copying and Concatenation, String and Array Utilities
@node String/Array Comparison
@section String/Array Comparison
@cindex comparing strings and arrays
@cindex string comparison functions
@ -613,7 +614,7 @@ strncmp ("hello, world", "hello, stupid world!!!", 5)
This is an obsolete alias for @code{memcmp}, derived from BSD.
@end deftypefun
@node Collation Functions, Search Functions, String/Array Comparison, String and Array Utilities
@node Collation Functions
@section Collation Functions
@cindex collating strings
@ -792,9 +793,9 @@ sort_strings_fast (char **array, int nstrings)
@end smallexample
@strong{Compatibility Note:} The string collation functions are a new
feature of @w{ISO C}. Older C dialects have no equivalent feature.
feature of @w{ISO C 89}. Older C dialects have no equivalent feature.
@node Search Functions, Finding Tokens in a String, Collation Functions, String and Array Utilities
@node Search Functions
@section Search Functions
This section describes library functions which perform various kinds
@ -940,7 +941,7 @@ strpbrk ("hello, world", " \t\n,.;!?")
@c @end group
@end deftypefun
@node Finding Tokens in a String, , Search Functions, String and Array Utilities
@node Finding Tokens in a String
@section Finding Tokens in a String
@cindex tokenizing strings
@ -1087,3 +1088,65 @@ token = strsep (&running, delimiters); /* token => "and" */
token = strsep (&running, delimiters); /* token => "punctuation" */
token = strsep (&running, delimiters); /* token => NULL */
@end smallexample
@node Encode Binary Data
@section Encode Binary Data
To store or transfer binary data in environments which only support text
one has to encode the binary data by mapping the input bytes to
characters in the range allowed for storing or transfering. SVID
systems (and nowadays XPG compliant systems) have such a function in the
C library.
@comment stdlib.h
@comment XPG
@deftypefun {char *} l64a (long int @var{n})
This function encodes an input value with 32 bits using characters from
the basic character set. Groups of 6 bits are encoded using the
following table:
@multitable {xxxxx} {xxx} {xxx} {xxx} {xxx} {xxx} {xxx} {xxx} {xxx}
@item @tab 0 @tab 1 @tab 2 @tab 3 @tab 4 @tab 5 @tab 6 @tab 7
@item 0 @tab @code{.} @tab @code{/} @tab @code{0} @tab @code{1}
@tab @code{2} @tab @code{3} @tab @code{4} @tab @code{5}
@item 8 @tab @code{6} @tab @code{7} @tab @code{8} @tab @code{9}
@tab @code{A} @tab @code{B} @tab @code{C} @tab @code{D}
@item 16 @tab @code{E} @tab @code{F} @tab @code{G} @tab @code{H}
@tab @code{I} @tab @code{J} @tab @code{K} @tab @code{L}
@item 24 @tab @code{M} @tab @code{N} @tab @code{O} @tab @code{P}
@tab @code{Q} @tab @code{R} @tab @code{S} @tab @code{T}
@item 32 @tab @code{U} @tab @code{V} @tab @code{W} @tab @code{X}
@tab @code{Y} @tab @code{Z} @tab @code{a} @tab @code{b}
@item 40 @tab @code{c} @tab @code{d} @tab @code{e} @tab @code{f}
@tab @code{g} @tab @code{h} @tab @code{i} @tab @code{j}
@item 48 @tab @code{k} @tab @code{l} @tab @code{m} @tab @code{n}
@tab @code{o} @tab @code{p} @tab @code{q} @tab @code{r}
@item 56 @tab @code{s} @tab @code{t} @tab @code{u} @tab @code{v}
@tab @code{w} @tab @code{x} @tab @code{y} @tab @code{z}
@end multitable
The function returns a pointer to a static buffer which contains the
string representing of the encoding of @var{n}. To encoded a series of
bytes the use should append the new string to the destination buffer.
@emph{Warning:} Since a static buffer is used this function should not
be used in multi-threaded programs. There is no thread-safe alternatice
to this function in the C library.
@end deftypefun
To decode data produced with @code{l64a} the following function should be
used.
@deftypefun {long int} a64l (const char *@var{string})
The parameter @var{string} should contain a string which was produced by
a call to @code{l64a}. The function processes the next 6 characters and
decodes the characters it finds according to the table above.
Characters not in the conversion table are simply ignored. This is
useful for breaking the information in lines in which case the end of
line characters are simply ignored.
The decoded number is returned at the end as a @code{long int} value.
Consecutive calls to this function are possible but the caller must make
sure the buffer pointer is update after each call to @code{a64l} since
this function does not modify the buffer pointer. Every call consumes 6
characters.
@end deftypefun

View File

@ -23,7 +23,7 @@ subdir := math
# Installed header files.
headers := math.h mathcalls.h __math.h huge_val.h nan.h \
fpu_control.h complex.h cmathcalls.h fenv.h \
fenvbits.h
fenvbits.h mathbits.h
# Internal header files.
distribute := math_private.h machine/asm.h machine/endian.h

View File

@ -100,7 +100,7 @@ __MATHCALL (cpow, (_Mdouble_complex_ __x, _Mdouble_complex_ __y));
__MATHCALL (csqrt, (_Mdouble_complex_ __z));
/* Absolute value, projections, conjugates, and projection. */
/* Absolute value, conjugates, and projection. */
/* Absolute value of Z. */
__MATHDECL (_Mdouble_,cabs, (_Mdouble_complex_ __z));

View File

@ -27,7 +27,11 @@ if test -d $1; then
to=`cd $1 && /bin/pwd`
else
temp=`echo $1 | sed 's%/*[^/]*$%%'`
to=`cd $temp && /bin/pwd`
if test -z "$temp"; then
to=`/bin/pwd`
else
to=`cd $temp && /bin/pwd`
fi
to="$to/`echo $1 | sed 's%.*/\([^/][^/]*\)$%\1%'`"
fi
to=`echo $to | sed 's%^/%%'`

View File

@ -42,7 +42,10 @@ __fgetspent_r (FILE *stream, struct spwd *resbuf, char *buffer, size_t buflen,
{
p = fgets (buffer, buflen, stream);
if (p == NULL)
return errno;
{
*result = NULL;
return errno;
}
/* Skip leading blanks. */
while (isspace (*p))

View File

@ -42,7 +42,7 @@ tests := tst-printf tstscanf test_rdwr test-popen tstgetln test-fseek \
temptest tst-fileno test-fwrite tst-ungetc tst-ferror \
xbug errnobug \
bug1 bug2 bug3 bug4 bug5 bug6 bug7 bug8 bug9 bug10 bug11 \
tfformat tiformat tstdiomisc \
tfformat tiformat tstdiomisc tst-printfsz \
scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10
@ -54,6 +54,7 @@ CFLAGS-tst-printf.c = -Wno-format
CFLAGS-tstdiomisc.c = -Wno-format
CFLAGS-scanf4.c = -Wno-format
CFLAGS-scanf7.c = -Wno-format
CFLAGS-tst-printfsz.c = -Wno-format
ifeq ($(stdio),libio)
ifneq (,$(filter %REENTRANT, $(defines)))

View File

@ -19,12 +19,12 @@
#include <stdlib.h>
long
long int
a64l (string)
const char *string;
{
int cnt;
long result = 0l;
size_t cnt;
long int result = 0l;
for (cnt = 0; cnt < 6; ++cnt)
{

View File

@ -29,7 +29,25 @@ seed48_r (seed16v, buffer)
memcpy (buffer->old_X, buffer->X, sizeof (buffer->X));
/* Install new state. */
memcpy (buffer->X, seed16v, sizeof (buffer->X));
#if USHRT_MAX == 0xffffU
buffer->X[2] = seed16v[2];
buffer->X[1] = seed16v[1];
buffer->X[0] = seed16v[0];
buffer->a[2] = 0x5;
buffer->a[1] = 0xdeec;
buffer->a[0] = 0xe66d;
#else
buffer->X[2] = (seed16v[2] << 16) | seed16v[1];
buffer->X[1] = seed16v[0] << 16;
buffer->X[0] = 0;
buffer->a[2] = 0x5deecUL;
buffer->a[1] = 0xe66d0000UL;
buffer->a[0] = 0;
#endif
buffer->c = 0xb;
buffer->init = 1;
return 0;
}

View File

@ -22,22 +22,32 @@
int
srand48_r (seedval, buffer)
long seedval;
long int seedval;
struct drand48_data *buffer;
{
/* The standards say we only have 32 bits. */
if (sizeof (long) > 4)
if (sizeof (long int) > 4)
seedval &= 0xffffffffl;
#if (USHRT_MAX == 0xffffU)
#if USHRT_MAX == 0xffffU
buffer->X[2] = seedval >> 16;
buffer->X[1] = seedval & 0xffffl;
buffer->X[0] = 0x330e;
buffer->a[2] = 0x5;
buffer->a[1] = 0xdeec;
buffer->a[0] = 0xe66d;
#else
buffer->X[2] = seedval;
buffer->X[1] = 0x330e0000UL;
buffer->X[0] = 0;
buffer->a[2] = 0x5deecUL;
buffer->a[1] = 0xe66d0000UL;
buffer->a[0] = 0;
#endif
buffer->c = 0xb;
buffer->init = 1;
return 0;
}

View File

@ -310,15 +310,15 @@ extern double drand48 __P ((void));
extern double erand48 __P ((unsigned short int __xsubi[3]));
/* Return non-negative, long integer in [0,2^31). */
extern long lrand48 __P ((void));
extern long nrand48 __P ((unsigned short int __xsubi[3]));
extern long int lrand48 __P ((void));
extern long int nrand48 __P ((unsigned short int __xsubi[3]));
/* Return signed, long integers in [-2^31,2^31). */
extern long mrand48 __P ((void));
extern long jrand48 __P ((unsigned short int __xsubi[3]));
extern long int mrand48 __P ((void));
extern long int jrand48 __P ((unsigned short int __xsubi[3]));
/* Seed random number generator. */
extern void srand48 __P ((long __seedval));
extern void srand48 __P ((long int __seedval));
extern unsigned short int *seed48 __P ((unsigned short int __seed16v[3]));
extern void lcong48 __P ((unsigned short int __param[7]));
@ -339,17 +339,17 @@ extern int erand48_r __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer, double *__result));
/* Return non-negative, long integer in [0,2^31). */
extern int lrand48_r __P ((struct drand48_data *__buffer, long *__result));
extern int lrand48_r __P ((struct drand48_data *__buffer, long int *__result));
extern int nrand48_r __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer, long *__result));
struct drand48_data *__buffer, long int *__result));
/* Return signed, long integers in [-2^31,2^31). */
extern int mrand48_r __P ((struct drand48_data *__buffer, long *__result));
extern int mrand48_r __P ((struct drand48_data *__buffer, long int *__result));
extern int jrand48_r __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer, long *__result));
struct drand48_data *__buffer, long int *__result));
/* Seed random number generator. */
extern int srand48_r __P ((long __seedval, struct drand48_data *__buffer));
extern int srand48_r __P ((long int __seedval, struct drand48_data *__buffer));
extern int seed48_r __P ((unsigned short int __seed16v[3],
struct drand48_data *__buffer));
extern int lcong48_r __P ((unsigned short int __param[7],

View File

@ -470,7 +470,7 @@ __finite (double __x)
/* ISO C 9X defines some macros to perform unordered comparisons. The
ix87 FPU supports this with special opcodes and we should use them.
This must not be inline functions since we have to be able to handle
These must not be inline functions since we have to be able to handle
all floating-point types. */
#undef isgreater
#define isgreater(x, y) \

View File

@ -40,16 +40,16 @@ static char rcsid[] = "$NetBSD: e_scalb.c,v 1.6 1995/05/10 20:46:09 jtc Exp $";
#endif
{
#ifdef _SCALB_INT
return scalbn(x,fn);
return __scalbn(x,fn);
#else
if (isnan(x)||isnan(fn)) return x*fn;
if (!finite(fn)) {
if (__isnan(x)||__isnan(fn)) return x*fn;
if (!__finite(fn)) {
if(fn>0.0) return x*fn;
else return x/(-fn);
}
if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
if ( fn > 65000.0) return scalbn(x, 65000);
if (-fn > 65000.0) return scalbn(x,-65000);
return scalbn(x,(int)fn);
if (__rint(fn)!=fn) return (fn-fn)/(fn-fn);
if ( fn > 65000.0) return __scalbn(x, 65000);
if (-fn > 65000.0) return __scalbn(x,-65000);
return __scalbn(x,(int)fn);
#endif
}

View File

@ -44,16 +44,16 @@ static char rcsid[] = "$NetBSD: $";
#endif
{
#ifdef _SCALB_INT
return scalbnl(x,fn);
return __scalbnl(x,fn);
#else
if (isnanl(x)||isnanl(fn)) return x*fn;
if (!finitel(fn)) {
if (__isnanl(x)||__isnanl(fn)) return x*fn;
if (!__finitel(fn)) {
if(fn>0.0) return x*fn;
else return x/(-fn);
}
if (rintl(fn)!=fn) return (fn-fn)/(fn-fn);
if ( fn > 65000.0) return scalbnl(x, 65000);
if (-fn > 65000.0) return scalbnl(x,-65000);
return scalbnl(x,(int)fn);
if (__rintl(fn)!=fn) return (fn-fn)/(fn-fn);
if ( fn > 65000.0) return __scalbnl(x, 65000);
if (-fn > 65000.0) return __scalbnl(x,-65000);
return __scalbnl(x,(int)fn);
#endif
}

View File

@ -29,7 +29,7 @@ __ctan (__complex__ double x)
{
__complex__ double res;
if (!finite (__real__ x) || !finite (__imag__ x))
if (!isfinite (__real__ x) || !isfinite (__imag__ x))
{
if (__isinf (__imag__ x))
{

View File

@ -29,7 +29,7 @@ __ctanf (__complex__ float x)
{
__complex__ float res;
if (!finite (__real__ x) || !finite (__imag__ x))
if (!isfinite (__real__ x) || !isfinite (__imag__ x))
{
if (__isinff (__imag__ x))
{

View File

@ -29,7 +29,7 @@ __ctanh (__complex__ double x)
{
__complex__ double res;
if (!finite (__real__ x) || !finite (__imag__ x))
if (!isfinite (__real__ x) || !isfinite (__imag__ x))
{
if (__isinf (__real__ x))
{

View File

@ -29,7 +29,7 @@ __ctanhf (__complex__ float x)
{
__complex__ float res;
if (!finite (__real__ x) || !finite (__imag__ x))
if (!isfinite (__real__ x) || !isfinite (__imag__ x))
{
if (__isinff (__real__ x))
{

View File

@ -29,7 +29,7 @@ __ctanhl (__complex__ long double x)
{
__complex__ long double res;
if (!finite (__real__ x) || !finite (__imag__ x))
if (!isfinite (__real__ x) || !isfinite (__imag__ x))
{
if (__isinfl (__real__ x))
{

View File

@ -27,9 +27,9 @@
__complex__ long double
__ctanl (__complex__ long double x)
{
__complex__ double res;
__complex__ long double res;
if (!finite (__real__ x) || !finite (__imag__ x))
if (!isfinite (__real__ x) || !isfinite (__imag__ x))
{
if (__isinfl (__imag__ x))
{

View File

@ -14,9 +14,6 @@
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: s_rintf.c,v 1.4 1995/05/10 20:48:06 jtc Exp $";
#endif
#include <fenv.h>
#include "math.h"
@ -33,9 +30,9 @@ TWO23[2]={
};
#ifdef __STDC__
float __rintf(float x)
float __nearbyintf(float x)
#else
float __rintf(x)
float __nearbyintf(x)
float x;
#endif
{
@ -77,4 +74,4 @@ TWO23[2]={
fesetenv (&env);
return t;
}
weak_alias (__rintf, rintf)
weak_alias (__nearbyintf, nearbyintf)

View File

@ -15,10 +15,6 @@
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* rintl(x)
* Return x rounded to integral value according to the prevailing
@ -44,9 +40,9 @@ TWO63[2]={
};
#ifdef __STDC__
long double __rintl(long double x)
long double __nearbyintl(long double x)
#else
long double __rintl(x)
long double __nearbyintl(x)
long double x;
#endif
{
@ -101,4 +97,4 @@ TWO63[2]={
fesetenv (&env);
return t;
}
weak_alias (__rintl, rintl)
weak_alias (__nearbyintl, nearbyintl)

View File

@ -274,6 +274,14 @@ __m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) \
__asm __volatile__ ("fmove%.l %0, %!" : /* No outputs. */ \
: "dmi" (__ctrl_reg)); \
return __result; \
} \
\
__m81_inline void \
__m81_u(__CONCAT(__sincos,s))(float_type __x, float_type *__sinx, \
float_type *__cosx) \
{ \
__asm ("fsincos%.x %2,%1:%0" \
: "=f" (*__sinx), "=f" (*__cosx) : "f" (__x)); \
}
/* This defines the three variants of the inline functions. */
@ -324,6 +332,10 @@ __inline_forward_c(int,ilogb, (double __value), (__value))
#ifdef __USE_ISOC9X
__inline_forward_c(double,nearbyint, (double __value), (__value))
#endif
#ifdef __USE_GNU
__inline_forward(void,sincos, (double __x, double *__sinx, double *__cosx),
(__x, __sinx, __cosx))
#endif
#if defined __USE_MISC || defined __USE_ISOC9X
@ -341,6 +353,10 @@ __inline_forward_c(int,ilogbf, (float __value), (__value))
#ifdef __USE_ISOC9X
__inline_forward_c(float,nearbyintf, (float __value), (__value))
#endif
#ifdef __USE_GNU
__inline_forward(void,sincosf, (float __x, float *__sinx, float *__cosx),
(__x, __sinx, __cosx))
#endif
__inline_forward(long double,frexpl, (long double __value, int *__expptr),
(__value, __expptr))
@ -358,12 +374,72 @@ __inline_forward_c(int,ilogbl, (long double __value), (__value))
__inline_forward_c(long double,nearbyintl, (long double __value), (__value))
__inline_forward_c(long int,rinttol, (long double __value), (__value))
#endif
#ifdef __USE_GNU
__inline_forward(void,sincosl,
(long double __x, long double *__sinx, long double *__cosx),
(__x, __sinx, __cosx))
#endif
#endif /* Use misc or ISO C9X */
#undef __inline_forward
#undef __inline_forward_c
#ifdef __USE_ISOC9X
/* ISO C 9X defines some macros to perform unordered comparisons. The
m68k FPU supports this with special opcodes and we should use them.
These must not be inline functions since we have to be able to handle
all floating-point types. */
#undef isgreater
#define isgreater(x, y) \
__extension__ \
({ char __result; \
__asm__ ("fcmp %2,%1; fsogt %0" \
: "=dm" (__result) : "f" (x), "f" (y)); \
(int) __result; })
#undef isgreaterequal
#define isgreaterequal(x, y) \
__extension__ \
({ char __result; \
__asm__ ("fcmp %2,%1; fsoge %0" \
: "=dm" (__result) : "f" (x), "f" (y)); \
(int) __result; })
#undef isless
#define isless(x, y) \
__extension__ \
({ char __result; \
__asm__ ("fcmp %2,%1; fsolt %0" \
: "=dm" (__result) : "f" (x), "f" (y)); \
(int) __result; })
#undef islessequal
#define islessequal(x, y) \
__extension__ \
({ char __result; \
__asm__ ("fcmp %2,%1; fsole %0" \
: "=dm" (__result) : "f" (x), "f" (y)); \
(int) __result; })
#undef islessgreater
#define islessgreater(x, y) \
__extension__ \
({ char __result; \
__asm__ ("fcmp %2,%1; fsogl %0" \
: "=dm" (__result) : "f" (x), "f" (y)); \
(int) __result; })
#undef isunordered
#define isunordered(x, y) \
__extension__ \
({ char __result; \
__asm__ ("fcmp %2,%1; fsun %0" \
: "=dm" (__result) : "f" (x), "f" (y)); \
(int) __result; })
#endif
#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */
#endif /* GCC. */

View File

@ -80,51 +80,36 @@ s(__ieee754_pow) (float_type x, float_type y)
z = 1 / z;
if (m81(__signbit) (x))
{
float_type temp = m81(__rint) (y);
if (y != temp)
if (y != m81(__rint) (y))
{
if (x == -1)
z = 0.0/0.0;
}
else
{
if (sizeof (float_type) == sizeof (float))
{
long i = (long) y;
if (i & 1)
z = -z;
}
else
{
long long i = (long long) y;
if ((float_type) i == y && i & 1)
z = -z;
}
}
goto maybe_negate;
}
return z;
}
if (x < 0.0)
{
float_type temp = m81(__rint) (y);
if (y == temp)
if (y == m81(__rint) (y))
{
long long i = (long long) y;
z = m81(__ieee754_exp) (y * m81(__ieee754_log) (-x));
if (sizeof (float_type) == sizeof (float))
{
long i = (long) y;
if (i & 1)
z = -z;
}
else
{
/* If the conversion to long long was inexact assume that y
is an even integer. */
if ((float_type) i == y && i & 1)
z = -z;
}
maybe_negate:
/* We always use the long double format, since y is already in
this format and rounding won't change the result. */
{
int32_t exponent;
u_int32_t i0, i1;
GET_LDOUBLE_WORDS (exponent, i0, i1, y);
exponent = (exponent & 0x7fff) - 0x3fff;
if (exponent <= 31
? i0 & (1 << (31 - exponent))
: (exponent <= 63
&& i1 & (1 << (63 - exponent))))
z = -z;
}
}
else
z = 0.0/0.0;

View File

@ -0,0 +1,39 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#define __LIBC_M81_MATH_INLINES
#include <math.h>
#ifndef FUNC
#define FUNC sincos
#endif
#ifndef float_type
#define float_type double
#endif
#define CONCATX(a,b) __CONCAT(a,b)
void
CONCATX(__,FUNC) (x, sinx, cosx)
float_type x, *sinx, *cosx;
{
__m81_u(CONCATX(__,FUNC))(x, sinx, cosx);
}
#define weak_aliasx(a,b) weak_alias(a,b)
weak_aliasx (CONCATX(__,FUNC), FUNC)

View File

@ -0,0 +1,3 @@
#define FUNC sincosf
#define float_type float
#include <s_sincos.c>

View File

@ -0,0 +1,3 @@
#define FUNC sincosl
#define float_type long double
#include <s_sincos.c>

View File

@ -1,21 +1,21 @@
/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sys/shm.h>
#include <errno.h>
@ -24,14 +24,14 @@ Boston, MA 02111-1307, USA. */
segment of the calling process. SHMADDR and SHMFLG determine how
and where the segment is attached. */
char *
void *
shmat (shmid, shmaddr, shmflg)
int shmid;
char *shmaddr;
const void *shmaddr;
int shmflg;
{
__set_errno (ENOSYS);
return (char *) -1;
return (void *) -1;
}
stub_warning (shmat)

View File

@ -1,21 +1,21 @@
/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sys/shm.h>
#include <errno.h>
@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
int
shmdt (shmaddr)
char *shmaddr;
const void *shmaddr;
{
__set_errno (ENOSYS);
return -1;