@node Arithmetic, Date and Time, Mathematics, Top
@c %MENU% Low level arithmetic functions
@chapter Arithmetic Functions

This chapter contains information about functions for doing basic
arithmetic operations, such as splitting a float into its integer and
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
* Integers::                    Basic integer types and concepts
* Integer Division::            Integer division with guaranteed rounding.
* Floating Point Numbers::      Basic concepts.  IEEE 754.
* Floating Point Classes::      The five kinds of floating-point number.
* Floating Point Errors::       When something goes wrong in a calculation.
* Rounding::                    Controlling how results are rounded.
* Control Functions::           Saving and restoring the FPU's state.
* Arithmetic Functions::        Fundamental operations provided by the library.
* Complex Numbers::             The types.  Writing complex constants.
* Operations on Complex::       Projection, conjugation, decomposition.
* Parsing of Numbers::          Converting strings to numbers.
* System V Number Conversion::  An archaic way to convert numbers to strings.
@end menu

@node Integers
@section Integers
@cindex integer

The C language defines several integer data types: integer, short integer,
long integer, and character, all in both signed and unsigned varieties.
The GNU C compiler extends the language to contain long long integers
as well.
@cindex signedness

The C integer types were intended to allow code to be portable among
machines with different inherent data sizes (word sizes), so each type
may have different ranges on different machines.  The problem with
this is that a program often needs to be written for a particular range
of integers, and sometimes must be written for a particular size of
storage, regardless of what machine the program runs on.

To address this problem, the GNU C library contains C type definitions
you can use to declare integers that meet your exact needs.  Because the
GNU C library header files are customized to a specific machine, your
program source code doesn't have to be.

These @code{typedef}s are in @file{stdint.h}.
@pindex stdint.h

If you require that an integer be represented in exactly N bits, use one
of the following types, with the obvious mapping to bit size and signedness:

@itemize @bullet
@item int8_t
@item int16_t
@item int32_t
@item int64_t
@item uint8_t
@item uint16_t
@item uint32_t
@item uint64_t
@end itemize

If your C compiler and target machine do not allow integers of a certain
size, the corresponding above type does not exist.

If you don't need a specific storage size, but want the smallest data
structure with @emph{at least} N bits, use one of these:

@itemize @bullet
@item int_least8_t
@item int_least16_t
@item int_least32_t
@item int_least64_t
@item uint_least8_t
@item uint_least16_t
@item uint_least32_t
@item uint_least64_t
@end itemize

If you don't need a specific storage size, but want the data structure
that allows the fastest access while having at least N bits (and
among data structures with the same access speed, the smallest one), use
one of these:

@itemize @bullet
@item int_fast8_t
@item int_fast16_t
@item int_fast32_t
@item int_fast64_t
@item uint_fast8_t
@item uint_fast16_t
@item uint_fast32_t
@item uint_fast64_t
@end itemize

If you want an integer with the widest range possible on the platform on
which it is being used, use one of the following.  If you use these,
you should write code that takes into account the variable size and range
of the integer.

@itemize @bullet
@item intmax_t
@item uintmax_t
@end itemize

The GNU C library also provides macros that tell you the maximum and
minimum possible values for each integer data type.  The macro names
follow these examples: @code{INT32_MAX}, @code{UINT8_MAX},
@code{INT_FAST32_MIN}, @code{INT_LEAST64_MIN}, @code{UINTMAX_MAX},
@code{INTMAX_MAX}, @code{INTMAX_MIN}.  Note that there are no macros for
unsigned integer minima.  These are always zero.
@cindex maximum possible integer
@cindex minimum possible integer

There are similar macros for use with C's built in integer types which
should come with your C compiler.  These are described in @ref{Data Type
Measurements}.

Don't forget you can use the C @code{sizeof} function with any of these
data types to get the number of bytes of storage each uses.


@node Integer Division
@section Integer Division
@cindex integer division functions

This section describes functions for performing integer division.  These
functions are redundant when GNU CC is used, because in GNU C the
@samp{/} operator always rounds towards zero.  But in other C
implementations, @samp{/} may round differently with negative arguments.
@code{div} and @code{ldiv} are useful because they specify how to round
the quotient: towards zero.  The remainder has the same sign as the
numerator.

These functions are specified to return a result @var{r} such that the value
@code{@var{r}.quot*@var{denominator} + @var{r}.rem} equals
@var{numerator}.

@pindex stdlib.h
To use these facilities, you should include the header file
@file{stdlib.h} in your program.

@comment stdlib.h
@comment ISO
@deftp {Data Type} div_t
This is a structure type used to hold the result returned by the @code{div}
function.  It has the following members:

@table @code
@item int quot
The quotient from the division.

@item int rem
The remainder from the division.
@end table
@end deftp

@comment stdlib.h
@comment ISO
@deftypefun div_t div (int @var{numerator}, int @var{denominator})
This function @code{div} computes the quotient and remainder from
the division of @var{numerator} by @var{denominator}, returning the
result in a structure of type @code{div_t}.

If the result cannot be represented (as in a division by zero), the
behavior is undefined.

Here is an example, albeit not a very useful one.

@smallexample
div_t result;
result = div (20, -6);
@end smallexample

@noindent
Now @code{result.quot} is @code{-3} and @code{result.rem} is @code{2}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftp {Data Type} ldiv_t
This is a structure type used to hold the result returned by the @code{ldiv}
function.  It has the following members:

@table @code
@item long int quot
The quotient from the division.

@item long int rem
The remainder from the division.
@end table

(This is identical to @code{div_t} except that the components are of
type @code{long int} rather than @code{int}.)
@end deftp

@comment stdlib.h
@comment ISO
@deftypefun ldiv_t ldiv (long int @var{numerator}, long int @var{denominator})
The @code{ldiv} function is similar to @code{div}, except that the
arguments are of type @code{long int} and the result is returned as a
structure of type @code{ldiv_t}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftp {Data Type} lldiv_t
This is a structure type used to hold the result returned by the @code{lldiv}
function.  It has the following members:

@table @code
@item long long int quot
The quotient from the division.

@item long long int rem
The remainder from the division.
@end table

(This is identical to @code{div_t} except that the components are of
type @code{long long int} rather than @code{int}.)
@end deftp

@comment stdlib.h
@comment ISO
@deftypefun lldiv_t lldiv (long long int @var{numerator}, long long int @var{denominator})
The @code{lldiv} function is like the @code{div} function, but the
arguments are of type @code{long long int} and the result is returned as
a structure of type @code{lldiv_t}.

The @code{lldiv} function was added in @w{ISO C99}.
@end deftypefun

@comment inttypes.h
@comment ISO
@deftp {Data Type} imaxdiv_t
This is a structure type used to hold the result returned by the @code{imaxdiv}
function.  It has the following members:

@table @code
@item intmax_t quot
The quotient from the division.

@item intmax_t rem
The remainder from the division.
@end table

(This is identical to @code{div_t} except that the components are of
type @code{intmax_t} rather than @code{int}.)

See @ref{Integers} for a description of the @code{intmax_t} type.

@end deftp

@comment inttypes.h
@comment ISO
@deftypefun imaxdiv_t imaxdiv (intmax_t @var{numerator}, intmax_t @var{denominator})
The @code{imaxdiv} function is like the @code{div} function, but the
arguments are of type @code{intmax_t} and the result is returned as
a structure of type @code{imaxdiv_t}.

See @ref{Integers} for a description of the @code{intmax_t} type.

The @code{imaxdiv} function was added in @w{ISO C99}.
@end deftypefun


@node Floating Point Numbers
@section Floating Point Numbers
@cindex floating point
@cindex IEEE 754
@cindex IEEE floating point

Most computer hardware has support for two different kinds of numbers:
integers (@math{@dots{}-3, -2, -1, 0, 1, 2, 3@dots{}}) and
floating-point numbers.  Floating-point numbers have three parts: the
@dfn{mantissa}, the @dfn{exponent}, and the @dfn{sign bit}.  The real
number represented by a floating-point value is given by
@tex
$(s \mathrel? -1 \mathrel: 1) \cdot 2^e \cdot M$
@end tex
@ifnottex
@math{(s ? -1 : 1) @mul{} 2^e @mul{} M}
@end ifnottex
where @math{s} is the sign bit, @math{e} the exponent, and @math{M}
the mantissa.  @xref{Floating Point Concepts}, for details.  (It is
possible to have a different @dfn{base} for the exponent, but all modern
hardware uses @math{2}.)

Floating-point numbers can represent a finite subset of the real
numbers.  While this subset is large enough for most purposes, it is
important to remember that the only reals that can be represented
exactly are rational numbers that have a terminating binary expansion
shorter than the width of the mantissa.  Even simple fractions such as
@math{1/5} can only be approximated by floating point.

Mathematical operations and functions frequently need to produce values
that are not representable.  Often these values can be approximated
closely enough for practical purposes, but sometimes they can't.
Historically there was no way to tell when the results of a calculation
were inaccurate.  Modern computers implement the @w{IEEE 754} standard
for numerical computations, which defines a framework for indicating to
the program when the results of calculation are not trustworthy.  This
framework consists of a set of @dfn{exceptions} that indicate why a
result could not be represented, and the special values @dfn{infinity}
and @dfn{not a number} (NaN).

@node Floating Point Classes
@section Floating-Point Number Classification Functions
@cindex floating-point classes
@cindex classes, floating-point
@pindex math.h

@w{ISO C99} defines macros that let you determine what sort of
floating-point number a variable holds.

@comment math.h
@comment ISO
@deftypefn {Macro} 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{Infinity
and NaN})
@item FP_INFINITE
The value of @var{x} is either plus or minus infinity (@pxref{Infinity
and NaN})
@item FP_ZERO
The value of @var{x} is zero.  In floating-point formats like @w{IEEE
754}, where zero can be signed, this value is also returned if
@var{x} is negative zero.
@item FP_SUBNORMAL
Numbers whose absolute value is too small to be represented in the
normal format are represented in an alternate, @dfn{denormalized} format
(@pxref{Floating Point Concepts}).  This format is less precise but can
represent values closer to zero.  @code{fpclassify} returns this value
for values of @var{x} in this alternate format.
@item FP_NORMAL
This value is returned for all other values of @var{x}.  It indicates
that there is nothing special about the number.
@end vtable

@end deftypefn

@code{fpclassify} is most useful if more than one property of a number
must be tested.  There are more specific macros which only test one
property at a time.  Generally these macros execute faster than
@code{fpclassify}, since there is special hardware support for them.
You should therefore use the specific macros whenever possible.

@comment math.h
@comment ISO
@deftypefn {Macro} int isfinite (@emph{float-type} @var{x})
This macro returns a nonzero value if @var{x} is finite: not plus or
minus infinity, and not NaN.  It is equivalent to

@smallexample
(fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)
@end smallexample

@code{isfinite} is implemented as a macro which accepts any
floating-point type.
@end deftypefn

@comment math.h
@comment ISO
@deftypefn {Macro} int isnormal (@emph{float-type} @var{x})
This macro returns a nonzero value if @var{x} is finite and normalized.
It is equivalent to

@smallexample
(fpclassify (x) == FP_NORMAL)
@end smallexample
@end deftypefn

@comment math.h
@comment ISO
@deftypefn {Macro} int isnan (@emph{float-type} @var{x})
This macro returns a nonzero value if @var{x} is NaN.  It is equivalent
to

@smallexample
(fpclassify (x) == FP_NAN)
@end smallexample
@end deftypefn

Another set of floating-point classification functions was provided by
BSD.  The GNU C library also supports these functions; however, we
recommend that you use the ISO C99 macros in new code.  Those are standard
and will be available more widely.  Also, since they are macros, you do
not have to worry about the type of their argument.

@comment math.h
@comment BSD
@deftypefun int isinf (double @var{x})
@comment math.h
@comment BSD
@deftypefunx int isinff (float @var{x})
@comment math.h
@comment BSD
@deftypefunx 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

@comment math.h
@comment BSD
@deftypefun int isnan (double @var{x})
@comment math.h
@comment BSD
@deftypefunx int isnanf (float @var{x})
@comment math.h
@comment BSD
@deftypefunx int isnanl (long double @var{x})
This function returns a nonzero value if @var{x} is a ``not a number''
value, and zero otherwise.

@strong{NB:} The @code{isnan} macro defined by @w{ISO C99} overrides
the BSD function.  This is normally not a problem, because the two
routines behave identically.  However, if you really need to get the BSD
function for some reason, you can write

@smallexample
(isnan) (x)
@end smallexample
@end deftypefun

@comment math.h
@comment BSD
@deftypefun int finite (double @var{x})
@comment math.h
@comment BSD
@deftypefunx int finitef (float @var{x})
@comment math.h
@comment BSD
@deftypefunx 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

@strong{Portability Note:} The functions listed in this section are BSD
extensions.


@node Floating Point Errors
@section Errors in Floating-Point Calculations

@menu
* FP Exceptions::               IEEE 754 math exceptions and how to detect them.
* Infinity and NaN::            Special values returned by calculations.
* Status bit operations::       Checking for exceptions after the fact.
* Math Error Reporting::        How the math functions report errors.
@end menu

@node FP Exceptions
@subsection FP Exceptions
@cindex exception
@cindex signal
@cindex zero divide
@cindex division by zero
@cindex inexact exception
@cindex invalid exception
@cindex overflow exception
@cindex underflow exception

The @w{IEEE 754} standard defines five @dfn{exceptions} that can occur
during a calculation.  Each corresponds to a particular sort of error,
such as overflow.

When exceptions occur (when exceptions are @dfn{raised}, in the language
of the standard), one of two things can happen.  By default the
exception is simply noted in the floating-point @dfn{status word}, and
the program continues as if nothing had happened.  The operation
produces a default value, which depends on the exception (see the table
below).  Your program can check the status word to find out which
exceptions happened.

Alternatively, you can enable @dfn{traps} for exceptions.  In that case,
when an exception is raised, your program will receive the @code{SIGFPE}
signal.  The default action for this signal is to terminate the
program.  @xref{Signal Handling}, for how you can change the effect of
the signal.

@findex matherr
In the System V math library, the user-defined function @code{matherr}
is called when certain exceptions occur inside math library functions.
However, the Unix98 standard deprecates this interface.  We support it
for historical compatibility, but recommend that you do not use it in
new programs.

@noindent
The exceptions defined in @w{IEEE 754} are:

@table @samp
@item Invalid Operation
This exception is raised if the given operands are invalid for the
operation to be performed.  Examples are
(see @w{IEEE 754}, @w{section 7}):
@enumerate
@item
Addition or subtraction: @math{@infinity{} - @infinity{}}.  (But
@math{@infinity{} + @infinity{} = @infinity{}}).
@item
Multiplication: @math{0 @mul{} @infinity{}}.
@item
Division: @math{0/0} or @math{@infinity{}/@infinity{}}.
@item
Remainder: @math{x} REM @math{y}, where @math{y} is zero or @math{x} is
infinite.
@item
Square root if the operand is less then zero.  More generally, any
mathematical function evaluated outside its domain produces this
exception.
@item
Conversion of a floating-point number to an integer or decimal
string, when the number cannot be represented in the target format (due
to overflow, infinity, or NaN).
@item
Conversion of an unrecognizable input string.
@item
Comparison via predicates involving @math{<} or @math{>}, when one or
other of the operands is NaN.  You can prevent this exception by using
the unordered comparison functions instead; see @ref{FP Comparison Functions}.
@end enumerate

If the exception does not trap, the result of the operation is NaN.

@item Division by Zero
This exception is raised when a finite nonzero number is divided
by zero.  If no trap occurs the result is either @math{+@infinity{}} or
@math{-@infinity{}}, depending on the signs of the operands.

@item Overflow
This exception is raised whenever the result cannot be represented
as a finite value in the precision format of the destination.  If no trap
occurs the result depends on the sign of the intermediate result and the
current rounding mode (@w{IEEE 754}, @w{section 7.3}):
@enumerate
@item
Round to nearest carries all overflows to @math{@infinity{}}
with the sign of the intermediate result.
@item
Round toward @math{0} carries all overflows to the largest representable
finite number with the sign of the intermediate result.
@item
Round toward @math{-@infinity{}} carries positive overflows to the
largest representable finite number and negative overflows to
@math{-@infinity{}}.

@item
Round toward @math{@infinity{}} carries negative overflows to the
most negative representable finite number and positive overflows
to @math{@infinity{}}.
@end enumerate

Whenever the overflow exception is raised, the inexact exception is also
raised.

@item Underflow
The underflow exception is raised when an intermediate result is too
small to be calculated accurately, or if the operation's result rounded
to the destination precision is too small to be normalized.

When no trap is installed for the underflow exception, underflow is
signaled (via the underflow flag) only when both tininess and loss of
accuracy have been detected.  If no trap handler is installed the
operation continues with an imprecise small value, or zero if the
destination precision cannot hold the small exact result.

@item Inexact
This exception is signalled if a rounded result is not exact (such as
when calculating the square root of two) or a result overflows without
an overflow trap.
@end table

@node Infinity and NaN
@subsection Infinity and NaN
@cindex infinity
@cindex not a number
@cindex NaN

@w{IEEE 754} floating point numbers can represent positive or negative
infinity, and @dfn{NaN} (not a number).  These three values arise from
calculations whose result is undefined or cannot be represented
accurately.  You can also deliberately set a floating-point variable to
any of them, which is sometimes useful.  Some examples of calculations
that produce infinity or NaN:

@ifnottex
@smallexample
@math{1/0 = @infinity{}}
@math{log (0) = -@infinity{}}
@math{sqrt (-1) = NaN}
@end smallexample
@end ifnottex
@tex
$${1\over0} = \infty$$
$$\log 0 = -\infty$$
$$\sqrt{-1} = \hbox{NaN}$$
@end tex

When a calculation produces any of these values, an exception also
occurs; see @ref{FP Exceptions}.

The basic operations and math functions all accept infinity and NaN and
produce sensible output.  Infinities propagate through calculations as
one would expect: for example, @math{2 + @infinity{} = @infinity{}},
@math{4/@infinity{} = 0}, atan @math{(@infinity{}) = @pi{}/2}.  NaN, on
the other hand, infects any calculation that involves it.  Unless the
calculation would produce the same result no matter what real value
replaced NaN, the result is NaN.

In comparison operations, positive infinity is larger than all values
except itself and NaN, and negative infinity is smaller than all values
except itself and NaN.  NaN is @dfn{unordered}: it is not equal to,
greater than, or less than anything, @emph{including itself}. @code{x ==
x} is false if the value of @code{x} is NaN.  You can use this to test
whether a value is NaN or not, but the recommended way to test for NaN
is with the @code{isnan} function (@pxref{Floating Point Classes}).  In
addition, @code{<}, @code{>}, @code{<=}, and @code{>=} will raise an
exception when applied to NaNs.

@file{math.h} defines macros that allow you to explicitly set a variable
to infinity or NaN.

@comment math.h
@comment ISO
@deftypevr Macro float INFINITY
An expression representing positive infinity.  It is equal to the value
produced  by mathematical operations like @code{1.0 / 0.0}.
@code{-INFINITY} represents negative infinity.

You can test whether a floating-point value is infinite by comparing it
to this macro.  However, this is not recommended; you should use the
@code{isfinite} macro instead.  @xref{Floating Point Classes}.

This macro was introduced in the @w{ISO C99} standard.
@end deftypevr

@comment math.h
@comment GNU
@deftypevr Macro float NAN
An expression representing a value which is ``not a number''.  This
macro is a GNU extension, available only on machines that support the
``not a number'' value---that is to say, on all machines that support
IEEE floating point.

You can use @samp{#ifdef NAN} to test whether the machine supports
NaN.  (Of course, you must arrange for GNU extensions to be visible,
such as by defining @code{_GNU_SOURCE}, and then you must include
@file{math.h}.)
@end deftypevr

@w{IEEE 754} also allows for another unusual value: negative zero.  This
value is produced when you divide a positive number by negative
infinity, or when a negative result is smaller than the limits of
representation.  Negative zero behaves identically to zero in all
calculations, unless you explicitly test the sign bit with
@code{signbit} or @code{copysign}.

@node Status bit operations
@subsection Examining the FPU status word

@w{ISO C99} defines functions to query and manipulate the
floating-point status word.  You can use these functions to check for
untrapped exceptions when it's convenient, rather than worrying about
them in the middle of a calculation.

These constants represent the various @w{IEEE 754} exceptions.  Not all
FPUs report all the different exceptions.  Each constant is defined if
and only if the FPU you are compiling for supports that exception, so
you can test for FPU support with @samp{#ifdef}.  They are defined in
@file{fenv.h}.

@vtable @code
@comment fenv.h
@comment ISO
@item FE_INEXACT
 The inexact exception.
@comment fenv.h
@comment ISO
@item FE_DIVBYZERO
 The divide by zero exception.
@comment fenv.h
@comment ISO
@item FE_UNDERFLOW
 The underflow exception.
@comment fenv.h
@comment ISO
@item FE_OVERFLOW
 The overflow exception.
@comment fenv.h
@comment ISO
@item FE_INVALID
 The invalid exception.
@end vtable

The macro @code{FE_ALL_EXCEPT} is the bitwise OR of all exception macros
which are supported by the FP implementation.

These functions allow you to clear exception flags, test for exceptions,
and save and restore the set of exceptions flagged.

@comment fenv.h
@comment ISO
@deftypefun int feclearexcept (int @var{excepts})
This function clears all of the supported exception flags indicated by
@var{excepts}.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

@comment fenv.h
@comment ISO
@deftypefun int feraiseexcept (int @var{excepts})
This function raises the supported exceptions indicated by
@var{excepts}.  If more than one exception bit in @var{excepts} is set
the order in which the exceptions are raised is undefined except that
overflow (@code{FE_OVERFLOW}) or underflow (@code{FE_UNDERFLOW}) are
raised before inexact (@code{FE_INEXACT}).  Whether for overflow or
underflow the inexact exception is also raised is also implementation
dependent.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

@comment fenv.h
@comment ISO
@deftypefun int fetestexcept (int @var{excepts})
Test whether the exception flags indicated by the parameter @var{except}
are currently set.  If any of them are, a nonzero value is returned
which specifies which exceptions are set.  Otherwise the result is zero.
@end deftypefun

To understand these functions, imagine that the status word is an
integer variable named @var{status}.  @code{feclearexcept} is then
equivalent to @samp{status &= ~excepts} and @code{fetestexcept} is
equivalent to @samp{(status & excepts)}.  The actual implementation may
be very different, of course.

Exception flags are only cleared when the program explicitly requests it,
by calling @code{feclearexcept}.  If you want to check for exceptions
from a set of calculations, you should clear all the flags first.  Here
is a simple example of the way to use @code{fetestexcept}:

@smallexample
@{
  double f;
  int raised;
  feclearexcept (FE_ALL_EXCEPT);
  f = compute ();
  raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
  if (raised & FE_OVERFLOW) @{ /* @dots{} */ @}
  if (raised & FE_INVALID) @{ /* @dots{} */ @}
  /* @dots{} */
@}
@end smallexample

You cannot explicitly set bits in the status word.  You can, however,
save the entire status word and restore it later.  This is done with the
following functions:

@comment fenv.h
@comment ISO
@deftypefun int fegetexceptflag (fexcept_t *@var{flagp}, int @var{excepts})
This function stores in the variable pointed to by @var{flagp} an
implementation-defined value representing the current setting of the
exception flags indicated by @var{excepts}.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

@comment fenv.h
@comment ISO
@deftypefun int fesetexceptflag (const fexcept_t *@var{flagp}, int @var{excepts})
This function restores the flags for the exceptions indicated by
@var{excepts} to the values stored in the variable pointed to by
@var{flagp}.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

Note that the value stored in @code{fexcept_t} bears no resemblance to
the bit mask returned by @code{fetestexcept}.  The type may not even be
an integer.  Do not attempt to modify an @code{fexcept_t} variable.

@node Math Error Reporting
@subsection Error Reporting by Mathematical Functions
@cindex errors, mathematical
@cindex domain error
@cindex range error

Many of the math functions are defined only over a subset of the real or
complex numbers.  Even if they are mathematically defined, their result
may be larger or smaller than the range representable by their return
type.  These are known as @dfn{domain errors}, @dfn{overflows}, and
@dfn{underflows}, respectively.  Math functions do several things when
one of these errors occurs.  In this manual we will refer to the
complete response as @dfn{signalling} a domain error, overflow, or
underflow.

When a math function suffers a domain error, it raises the invalid
exception and returns NaN.  It also sets @var{errno} to @code{EDOM};
this is for compatibility with old systems that do not support @w{IEEE
754} exception handling.  Likewise, when overflow occurs, math
functions raise the overflow exception and return @math{@infinity{}} or
@math{-@infinity{}} as appropriate.  They also set @var{errno} to
@code{ERANGE}.  When underflow occurs, the underflow exception is
raised, and zero (appropriately signed) is returned.  @var{errno} may be
set to @code{ERANGE}, but this is not guaranteed.

Some of the math functions are defined mathematically to result in a
complex value over parts of their domains.  The most familiar example of
this is taking the square root of a negative number.  The complex math
functions, such as @code{csqrt}, will return the appropriate complex value
in this case.  The real-valued functions, such as @code{sqrt}, will
signal a domain error.

Some older hardware does not support infinities.  On that hardware,
overflows instead return a particular very large number (usually the
largest representable number).  @file{math.h} defines macros you can use
to test for overflow on both old and new hardware.

@comment math.h
@comment ISO
@deftypevr Macro double HUGE_VAL
@comment math.h
@comment ISO
@deftypevrx Macro float HUGE_VALF
@comment math.h
@comment ISO
@deftypevrx Macro {long double} HUGE_VALL
An expression representing a particular very large number.  On machines
that use @w{IEEE 754} floating point format, @code{HUGE_VAL} is infinity.
On other machines, it's typically the largest positive number that can
be represented.

Mathematical functions return the appropriately typed version of
@code{HUGE_VAL} or @code{@minus{}HUGE_VAL} when the result is too large
to be represented.
@end deftypevr

@node Rounding
@section Rounding Modes

Floating-point calculations are carried out internally with extra
precision, and then rounded to fit into the destination type.  This
ensures that results are as precise as the input data.  @w{IEEE 754}
defines four possible rounding modes:

@table @asis
@item Round to nearest.
This is the default mode.  It should be used unless there is a specific
need for one of the others.  In this mode results are rounded to the
nearest representable value.  If the result is midway between two
representable values, the even representable is chosen. @dfn{Even} here
means the lowest-order bit is zero.  This rounding mode prevents
statistical bias and guarantees numeric stability: round-off errors in a
lengthy calculation will remain smaller than half of @code{FLT_EPSILON}.

@c @item Round toward @math{+@infinity{}}
@item Round toward plus Infinity.
All results are rounded to the smallest representable value
which is greater than the result.

@c @item Round toward @math{-@infinity{}}
@item Round toward minus Infinity.
All results are rounded to the largest representable value which is less
than the result.

@item Round toward zero.
All results are rounded to the largest representable value whose
magnitude is less than that of the result.  In other words, if the
result is negative it is rounded up; if it is positive, it is rounded
down.
@end table

@noindent
@file{fenv.h} defines constants which you can use to refer to the
various rounding modes.  Each one will be defined if and only if the FPU
supports the corresponding rounding mode.

@table @code
@comment fenv.h
@comment ISO
@vindex FE_TONEAREST
@item FE_TONEAREST
Round to nearest.

@comment fenv.h
@comment ISO
@vindex FE_UPWARD
@item FE_UPWARD
Round toward @math{+@infinity{}}.

@comment fenv.h
@comment ISO
@vindex FE_DOWNWARD
@item FE_DOWNWARD
Round toward @math{-@infinity{}}.

@comment fenv.h
@comment ISO
@vindex FE_TOWARDZERO
@item FE_TOWARDZERO
Round toward zero.
@end table

Underflow is an unusual case.  Normally, @w{IEEE 754} floating point
numbers are always normalized (@pxref{Floating Point Concepts}).
Numbers smaller than @math{2^r} (where @math{r} is the minimum exponent,
@code{FLT_MIN_RADIX-1} for @var{float}) cannot be represented as
normalized numbers.  Rounding all such numbers to zero or @math{2^r}
would cause some algorithms to fail at 0.  Therefore, they are left in
denormalized form.  That produces loss of precision, since some bits of
the mantissa are stolen to indicate the decimal point.

If a result is too small to be represented as a denormalized number, it
is rounded to zero.  However, the sign of the result is preserved; if
the calculation was negative, the result is @dfn{negative zero}.
Negative zero can also result from some operations on infinity, such as
@math{4/-@infinity{}}.  Negative zero behaves identically to zero except
when the @code{copysign} or @code{signbit} functions are used to check
the sign bit directly.

At any time one of the above four rounding modes is selected.  You can
find out which one with this function:

@comment fenv.h
@comment ISO
@deftypefun int fegetround (void)
Returns the currently selected rounding mode, represented by one of the
values of the defined rounding mode macros.
@end deftypefun

@noindent
To change the rounding mode, use this function:

@comment fenv.h
@comment ISO
@deftypefun int fesetround (int @var{round})
Changes the currently selected rounding mode to @var{round}.  If
@var{round} does not correspond to one of the supported rounding modes
nothing is changed.  @code{fesetround} returns zero if it changed the
rounding mode, a nonzero value if the mode is not supported.
@end deftypefun

You should avoid changing the rounding mode if possible.  It can be an
expensive operation; also, some hardware requires you to compile your
program differently for it to work.  The resulting code may run slower.
See your compiler documentation for details.
@c This section used to claim that functions existed to round one number
@c in a specific fashion.  I can't find any functions in the library
@c that do that. -zw

@node Control Functions
@section Floating-Point Control Functions

@w{IEEE 754} floating-point implementations allow the programmer to
decide whether traps will occur for each of the exceptions, by setting
bits in the @dfn{control word}.  In C, traps result in the program
receiving the @code{SIGFPE} signal; see @ref{Signal Handling}.

@strong{NB:} @w{IEEE 754} says that trap handlers are given details of
the exceptional situation, and can set the result value.  C signals do
not provide any mechanism to pass this information back and forth.
Trapping exceptions in C is therefore not very useful.

It is sometimes necessary to save the state of the floating-point unit
while you perform some calculation.  The library provides functions
which save and restore the exception flags, the set of exceptions that
generate traps, and the rounding mode.  This information is known as the
@dfn{floating-point environment}.

The functions to save and restore the floating-point environment all use
a variable of type @code{fenv_t} to store information.  This type is
defined in @file{fenv.h}.  Its size and contents are
implementation-defined.  You should not attempt to manipulate a variable
of this type directly.

To save the state of the FPU, use one of these functions:

@comment fenv.h
@comment ISO
@deftypefun int fegetenv (fenv_t *@var{envp})
Store the floating-point environment in the variable pointed to by
@var{envp}.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

@comment fenv.h
@comment ISO
@deftypefun int feholdexcept (fenv_t *@var{envp})
Store the current floating-point environment in the object pointed to by
@var{envp}.  Then clear all exception flags, and set the FPU to trap no
exceptions.  Not all FPUs support trapping no exceptions; if
@code{feholdexcept} cannot set this mode, it returns nonzero value.  If it
succeeds, it returns zero.
@end deftypefun

The functions which restore the floating-point environment can take these
kinds of arguments:

@itemize @bullet
@item
Pointers to @code{fenv_t} objects, which were initialized previously by a
call to @code{fegetenv} or @code{feholdexcept}.
@item
@vindex FE_DFL_ENV
The special macro @code{FE_DFL_ENV} which represents the floating-point
environment as it was available at program start.
@item
Implementation defined macros with names starting with @code{FE_} and
having type @code{fenv_t *}.

@vindex FE_NOMASK_ENV
If possible, the GNU C Library defines a macro @code{FE_NOMASK_ENV}
which represents an environment where every exception raised causes a
trap to occur.  You can test for this macro using @code{#ifdef}.  It is
only defined if @code{_GNU_SOURCE} is defined.

Some platforms might define other predefined environments.
@end itemize

@noindent
To set the floating-point environment, you can use either of these
functions:

@comment fenv.h
@comment ISO
@deftypefun int fesetenv (const fenv_t *@var{envp})
Set the floating-point environment to that described by @var{envp}.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

@comment fenv.h
@comment ISO
@deftypefun int feupdateenv (const fenv_t *@var{envp})
Like @code{fesetenv}, this function sets the floating-point environment
to that described by @var{envp}.  However, if any exceptions were
flagged in the status word before @code{feupdateenv} was called, they
remain flagged after the call.  In other words, after @code{feupdateenv}
is called, the status word is the bitwise OR of the previous status word
and the one saved in @var{envp}.

The function returns zero in case the operation was successful, a
non-zero value otherwise.
@end deftypefun

@noindent
To control for individual exceptions if raising them causes a trap to
occur, you can use the following two functions.

@strong{Portability Note:} These functions are all GNU extensions.

@comment fenv.h
@comment GNU
@deftypefun int feenableexcept (int @var{excepts})
This functions enables traps for each of the exceptions as indicated by
the parameter @var{except}.  The individual excepetions are described in
@ref{Status bit operations}.  Only the specified exceptions are
enabled, the status of the other exceptions is not changed.

The function returns the previous enabled exceptions in case the
operation was successful, @code{-1} otherwise.
@end deftypefun

@comment fenv.h
@comment GNU
@deftypefun int fedisableexcept (int @var{excepts})
This functions disables traps for each of the exceptions as indicated by
the parameter @var{except}.  The individual excepetions are described in
@ref{Status bit operations}.  Only the specified exceptions are
disabled, the status of the other exceptions is not changed.

The function returns the previous enabled exceptions in case the
operation was successful, @code{-1} otherwise.
@end deftypefun

@comment fenv.h
@comment GNU
@deftypefun int fegetexcept (int @var{excepts})
The function returns a bitmask of all currently enabled exceptions.  It
returns @code{-1} in case of failure.
@end deftypefun

@node Arithmetic Functions
@section Arithmetic Functions

The C library provides functions to do basic operations on
floating-point numbers.  These include absolute value, maximum and minimum,
normalization, bit twiddling, rounding, and a few others.

@menu
* Absolute Value::              Absolute values of integers and floats.
* Normalization Functions::     Extracting exponents and putting them back.
* Rounding Functions::          Rounding floats to integers.
* Remainder Functions::         Remainders on division, precisely defined.
* FP Bit Twiddling::            Sign bit adjustment.  Adding epsilon.
* FP Comparison Functions::     Comparisons without risk of exceptions.
* Misc FP Arithmetic::          Max, min, positive difference, multiply-add.
@end menu

@node Absolute Value
@subsection Absolute Value
@cindex absolute value functions

These functions are provided for obtaining the @dfn{absolute value} (or
@dfn{magnitude}) of a number.  The absolute value of a real number
@var{x} is @var{x} if @var{x} is positive, @minus{}@var{x} if @var{x} is
negative.  For a complex number @var{z}, whose real part is @var{x} and
whose imaginary part is @var{y}, the absolute value is @w{@code{sqrt
(@var{x}*@var{x} + @var{y}*@var{y})}}.

@pindex math.h
@pindex stdlib.h
Prototypes for @code{abs}, @code{labs} and @code{llabs} are in @file{stdlib.h};
@code{imaxabs} is declared in @file{inttypes.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
@deftypefun int abs (int @var{number})
@comment stdlib.h
@comment ISO
@deftypefunx {long int} labs (long int @var{number})
@comment stdlib.h
@comment ISO
@deftypefunx {long long int} llabs (long long int @var{number})
@comment inttypes.h
@comment ISO
@deftypefunx intmax_t imaxabs (intmax_t @var{number})
These functions return the absolute value of @var{number}.

Most computers use a two's complement integer representation, in which
the absolute value of @code{INT_MIN} (the smallest possible @code{int})
cannot be represented; thus, @w{@code{abs (INT_MIN)}} is not defined.

@code{llabs} and @code{imaxdiv} are new to @w{ISO C99}.

See @ref{Integers} for a description of the @code{intmax_t} type.

@end deftypefun

@comment math.h
@comment ISO
@deftypefun double fabs (double @var{number})
@comment math.h
@comment ISO
@deftypefunx float fabsf (float @var{number})
@comment math.h
@comment ISO
@deftypefunx {long double} fabsl (long double @var{number})
This function returns the absolute value of the floating-point number
@var{number}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun double cabs (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx float cabsf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {long double} cabsl (complex long double @var{z})
These functions return the absolute  value of the complex number @var{z}
(@pxref{Complex Numbers}).  The absolute value of a complex number is:

@smallexample
sqrt (creal (@var{z}) * creal (@var{z}) + cimag (@var{z}) * cimag (@var{z}))
@end smallexample

This function should always be used instead of the direct formula
because it takes special care to avoid losing precision.  It may also
take advantage of hardware support for this operation. See @code{hypot}
in @ref{Exponents and Logarithms}.
@end deftypefun

@node Normalization Functions
@subsection Normalization Functions
@cindex normalization functions (floating-point)

The functions described in this section are primarily provided as a way
to efficiently perform certain low-level manipulations on floating point
numbers that are represented internally using a binary radix;
see @ref{Floating Point Concepts}.  These functions are required to
have equivalent behavior even if the representation does not use a radix
of 2, but of course they are unlikely to be particularly efficient in
those cases.

@pindex math.h
All these functions are declared in @file{math.h}.

@comment math.h
@comment ISO
@deftypefun double frexp (double @var{value}, int *@var{exponent})
@comment math.h
@comment ISO
@deftypefunx float frexpf (float @var{value}, int *@var{exponent})
@comment math.h
@comment ISO
@deftypefunx {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}
times a power of two, and is always in the range 1/2 (inclusive) to 1
(exclusive).  The corresponding exponent is stored in
@code{*@var{exponent}}; the return value multiplied by 2 raised to this
exponent equals the original number @var{value}.

For example, @code{frexp (12.8, &exponent)} returns @code{0.8} and
stores @code{4} in @code{exponent}.

If @var{value} is zero, then the return value is zero and
zero is stored in @code{*@var{exponent}}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double ldexp (double @var{value}, int @var{exponent})
@comment math.h
@comment ISO
@deftypefunx float ldexpf (float @var{value}, int @var{exponent})
@comment math.h
@comment ISO
@deftypefunx {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}.)

For example, @code{ldexp (0.8, 4)} returns @code{12.8}.
@end deftypefun

The following functions, which come from BSD, provide facilities
equivalent to those of @code{ldexp} and @code{frexp}.  See also the
@w{ISO C} function @code{logb} which originally also appeared in BSD.

@comment math.h
@comment BSD
@deftypefun double scalb (double @var{value}, int @var{exponent})
@comment math.h
@comment BSD
@deftypefunx float scalbf (float @var{value}, int @var{exponent})
@comment math.h
@comment BSD
@deftypefunx {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 {long long int} scalbn (double @var{x}, int n)
@comment math.h
@comment BSD
@deftypefunx {long long int} scalbnf (float @var{x}, int n)
@comment math.h
@comment BSD
@deftypefunx {long long int} scalbnl (long double @var{x}, int n)
@code{scalbn} is identical to @code{scalb}, except that the exponent
@var{n} is an @code{int} instead of a floating-point number.
@end deftypefun

@comment math.h
@comment BSD
@deftypefun {long long int} scalbln (double @var{x}, long int n)
@comment math.h
@comment BSD
@deftypefunx {long long int} scalblnf (float @var{x}, long int n)
@comment math.h
@comment BSD
@deftypefunx {long long int} scalblnl (long double @var{x}, long int n)
@code{scalbln} is identical to @code{scalb}, except that the exponent
@var{n} is a @code{long int} instead of a floating-point number.
@end deftypefun

@comment math.h
@comment BSD
@deftypefun {long long int} significand (double @var{x})
@comment math.h
@comment BSD
@deftypefunx {long long int} significandf (float @var{x})
@comment math.h
@comment BSD
@deftypefunx {long long int} significandl (long double @var{x})
@code{significand} returns the mantissa of @var{x} scaled to the range
@math{[1, 2)}.
It is equivalent to @w{@code{scalb (@var{x}, (double) -ilogb (@var{x}))}}.

This function exists mainly for use in certain standardized tests
of @w{IEEE 754} conformance.
@end deftypefun

@node Rounding Functions
@subsection Rounding Functions
@cindex converting floats to integers

@pindex math.h
The functions listed here perform operations such as rounding and
truncation of floating-point values. Some of these functions convert
floating point numbers to integer values.  They are all declared in
@file{math.h}.

You can also convert floating-point numbers to integers simply by
casting them to @code{int}.  This discards the fractional part,
effectively rounding towards zero.  However, this only works if the
result can actually be represented as an @code{int}---for very large
numbers, this is impossible.  The functions listed here return the
result as a @code{double} instead to get around this problem.

@comment math.h
@comment ISO
@deftypefun double ceil (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float ceilf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {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

@comment math.h
@comment ISO
@deftypefun double floor (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float floorf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {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 ISO
@deftypefun double trunc (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float truncf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} truncl (long double @var{x})
The @code{trunc} functions round @var{x} towards zero to the nearest
integer (returned in floating-point format).  Thus, @code{trunc (1.5)}
is @code{1.0} and @code{trunc (-1.5)} is @code{-1.0}.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double rint (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float rintf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {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
support other modes, but round-to-nearest is always used unless
you explicitly select another.

If @var{x} was not initially an integer, these functions raise the
inexact exception.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double nearbyint (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float nearbyintf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} nearbyintl (long double @var{x})
These functions return the same value as the @code{rint} functions, but
do not raise the inexact exception if @var{x} is not an integer.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double round (double @var{x})
@comment math.h
@comment ISO
@deftypefunx float roundf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long double} roundl (long double @var{x})
These functions are similar to @code{rint}, but they round halfway
cases away from zero instead of to the nearest integer (or other
current rounding mode).
@end deftypefun

@comment math.h
@comment ISO
@deftypefun {long int} lrint (double @var{x})
@comment math.h
@comment ISO
@deftypefunx {long int} lrintf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long int} lrintl (long double @var{x})
These functions are just like @code{rint}, but they return a
@code{long int} instead of a floating-point number.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun {long long int} llrint (double @var{x})
@comment math.h
@comment ISO
@deftypefunx {long long int} llrintf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long long int} llrintl (long double @var{x})
These functions are just like @code{rint}, but they return a
@code{long long int} instead of a floating-point number.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun {long int} lround (double @var{x})
@comment math.h
@comment ISO
@deftypefunx {long int} lroundf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long int} lroundl (long double @var{x})
These functions are just like @code{round}, but they return a
@code{long int} instead of a floating-point number.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun {long long int} llround (double @var{x})
@comment math.h
@comment ISO
@deftypefunx {long long int} llroundf (float @var{x})
@comment math.h
@comment ISO
@deftypefunx {long long int} llroundl (long double @var{x})
These functions are just like @code{round}, but they return a
@code{long long int} instead of a floating-point number.
@end deftypefun


@comment math.h
@comment ISO
@deftypefun double modf (double @var{value}, double *@var{integer-part})
@comment math.h
@comment ISO
@deftypefunx float modff (float @var{value}, float *@var{integer-part})
@comment math.h
@comment ISO
@deftypefunx {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},
and the integer part is always rounded toward zero.

@code{modf} stores the integer part in @code{*@var{integer-part}}, and
returns the fractional part.  For example, @code{modf (2.5, &intpart)}
returns @code{0.5} and stores @code{2.0} into @code{intpart}.
@end deftypefun

@node Remainder Functions
@subsection Remainder Functions

The functions in this section compute the remainder on division of two
floating-point numbers.  Each is a little different; pick the one that
suits your problem.

@comment math.h
@comment ISO
@deftypefun double fmod (double @var{numerator}, double @var{denominator})
@comment math.h
@comment ISO
@deftypefunx float fmodf (float @var{numerator}, float @var{denominator})
@comment math.h
@comment ISO
@deftypefunx {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
towards zero to an integer.  Thus, @w{@code{fmod (6.5, 2.3)}} returns
@code{1.9}, which is @code{6.5} minus @code{4.6}.

The result has the same sign as the @var{numerator} and has magnitude
less than the magnitude of the @var{denominator}.

If @var{denominator} is zero, @code{fmod} signals a domain error.
@end deftypefun

@comment math.h
@comment BSD
@deftypefun double drem (double @var{numerator}, double @var{denominator})
@comment math.h
@comment BSD
@deftypefunx float dremf (float @var{numerator}, float @var{denominator})
@comment math.h
@comment BSD
@deftypefunx {long double} dreml (long double @var{numerator}, long double @var{denominator})
These functions are like @code{fmod} except that they round 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}.

The absolute value of the result is less than or equal to half the
absolute value of the @var{denominator}.  The difference between
@code{fmod (@var{numerator}, @var{denominator})} and @code{drem
(@var{numerator}, @var{denominator})} is always either
@var{denominator}, minus @var{denominator}, or zero.

If @var{denominator} is zero, @code{drem} signals a domain error.
@end deftypefun

@comment math.h
@comment BSD
@deftypefun double remainder (double @var{numerator}, double @var{denominator})
@comment math.h
@comment BSD
@deftypefunx float remainderf (float @var{numerator}, float @var{denominator})
@comment math.h
@comment BSD
@deftypefunx {long double} remainderl (long double @var{numerator}, long double @var{denominator})
This function is another name for @code{drem}.
@end deftypefun

@node FP Bit Twiddling
@subsection Setting and modifying single bits of FP values
@cindex FP arithmetic

There are some operations that are too complicated or expensive to
perform by hand on floating-point numbers.  @w{ISO C99} defines
functions to do these operations, which mostly involve changing single
bits.

@comment math.h
@comment ISO
@deftypefun double copysign (double @var{x}, double @var{y})
@comment math.h
@comment ISO
@deftypefunx float copysignf (float @var{x}, float @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} copysignl (long double @var{x}, long double @var{y})
These functions return @var{x} but with the sign of @var{y}.  They work
even if @var{x} or @var{y} are NaN or zero.  Both of these can carry a
sign (although not all implementations support it) and this is one of
the few operations that can tell the difference.

@code{copysign} never raises an exception.
@c except signalling NaNs

This function is defined in @w{IEC 559} (and the appendix with
recommended functions in @w{IEEE 754}/@w{IEEE 854}).
@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}, because @w{IEEE 754} floating
point allows zero to be signed.  The comparison @code{-0.0 < 0.0} is
false, but @code{signbit (-0.0)} will return a nonzero value.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double nextafter (double @var{x}, double @var{y})
@comment math.h
@comment ISO
@deftypefunx float nextafterf (float @var{x}, float @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} nextafterl (long double @var{x}, long double @var{y})
The @code{nextafter} function returns the next representable neighbor of
@var{x} in the direction towards @var{y}.  The size of the step between
@var{x} and the result depends on the type of the result.  If
@math{@var{x} = @var{y}} the function simply returns @var{y}.  If either
value is @code{NaN}, @code{NaN} is returned.  Otherwise
a value corresponding to the value of the least significant bit in the
mantissa is added or subtracted, depending on the direction.
@code{nextafter} will signal overflow or underflow if the result goes
outside of the range of normalized numbers.

This function is defined in @w{IEC 559} (and the appendix with
recommended functions in @w{IEEE 754}/@w{IEEE 854}).
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double nexttoward (double @var{x}, long double @var{y})
@comment math.h
@comment ISO
@deftypefunx float nexttowardf (float @var{x}, long double @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} nexttowardl (long double @var{x}, long double @var{y})
These functions are identical to the corresponding versions of
@code{nextafter} except that their second argument is a @code{long
double}.
@end deftypefun

@cindex NaN
@comment math.h
@comment ISO
@deftypefun double nan (const char *@var{tagp})
@comment math.h
@comment ISO
@deftypefunx float nanf (const char *@var{tagp})
@comment math.h
@comment ISO
@deftypefunx {long double} nanl (const char *@var{tagp})
The @code{nan} function returns a representation of NaN, provided that
NaN is supported by the target platform.
@code{nan ("@var{n-char-sequence}")} is equivalent to
@code{strtod ("NAN(@var{n-char-sequence})")}.

The argument @var{tagp} is used in an unspecified manner.  On @w{IEEE
754} systems, there are many representations of NaN, and @var{tagp}
selects one.  On other systems it may do nothing.
@end deftypefun

@node FP Comparison Functions
@subsection Floating-Point Comparison Functions
@cindex unordered comparison

The standard C comparison operators provoke exceptions when one or other
of the operands is NaN.  For example,

@smallexample
int v = a < 1.0;
@end smallexample

@noindent
will raise an exception if @var{a} is NaN.  (This does @emph{not}
happen with @code{==} and @code{!=}; those merely return false and true,
respectively, when NaN is examined.)  Frequently this exception is
undesirable.  @w{ISO C99} therefore defines comparison functions that
do not raise exceptions when NaN is examined.  All of the functions are
implemented as macros which allow their arguments to be of any
floating-point type.  The macros are guaranteed to evaluate their
arguments only once.

@comment math.h
@comment ISO
@deftypefn Macro int isgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
This macro determines whether the argument @var{x} is greater than
@var{y}.  It is equivalent to @code{(@var{x}) > (@var{y})}, but no
exception is raised if @var{x} or @var{y} are NaN.
@end deftypefn

@comment math.h
@comment ISO
@deftypefn Macro int isgreaterequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
This macro determines whether the argument @var{x} is greater than or
equal to @var{y}.  It is equivalent to @code{(@var{x}) >= (@var{y})}, but no
exception is raised if @var{x} or @var{y} are NaN.
@end deftypefn

@comment math.h
@comment ISO
@deftypefn Macro int isless (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
This macro determines whether the argument @var{x} is less than @var{y}.
It is equivalent to @code{(@var{x}) < (@var{y})}, but no exception is
raised if @var{x} or @var{y} are NaN.
@end deftypefn

@comment math.h
@comment ISO
@deftypefn Macro int islessequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
This macro determines whether the argument @var{x} is less than or equal
to @var{y}.  It is equivalent to @code{(@var{x}) <= (@var{y})}, but no
exception is raised if @var{x} or @var{y} are NaN.
@end deftypefn

@comment math.h
@comment ISO
@deftypefn Macro int islessgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
This macro determines whether the argument @var{x} is less or greater
than @var{y}.  It is equivalent to @code{(@var{x}) < (@var{y}) ||
(@var{x}) > (@var{y})} (although it only evaluates @var{x} and @var{y}
once), but no exception is raised if @var{x} or @var{y} are NaN.

This macro is not equivalent to @code{@var{x} != @var{y}}, because that
expression is true if @var{x} or @var{y} are NaN.
@end deftypefn

@comment math.h
@comment ISO
@deftypefn Macro int isunordered (@emph{real-floating} @var{x}, @emph{real-floating} @var{y})
This macro determines whether its arguments are unordered.  In other
words, it is true if @var{x} or @var{y} are NaN, and false otherwise.
@end deftypefn

Not all machines provide hardware support for these operations.  On
machines that don't, the macros can be very slow.  Therefore, you should
not use these functions when NaN is not a concern.

@strong{NB:} There are no macros @code{isequal} or @code{isunequal}.
They are unnecessary, because the @code{==} and @code{!=} operators do
@emph{not} throw an exception if one or both of the operands are NaN.

@node Misc FP Arithmetic
@subsection Miscellaneous FP arithmetic functions
@cindex minimum
@cindex maximum
@cindex positive difference
@cindex multiply-add

The functions in this section perform miscellaneous but common
operations that are awkward to express with C operators.  On some
processors these functions can use special machine instructions to
perform these operations faster than the equivalent C code.

@comment math.h
@comment ISO
@deftypefun double fmin (double @var{x}, double @var{y})
@comment math.h
@comment ISO
@deftypefunx float fminf (float @var{x}, float @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} fminl (long double @var{x}, long double @var{y})
The @code{fmin} function returns the lesser of the two values @var{x}
and @var{y}.  It is similar to the expression
@smallexample
((x) < (y) ? (x) : (y))
@end smallexample
except that @var{x} and @var{y} are only evaluated once.

If an argument is NaN, the other argument is returned.  If both arguments
are NaN, NaN is returned.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double fmax (double @var{x}, double @var{y})
@comment math.h
@comment ISO
@deftypefunx float fmaxf (float @var{x}, float @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} fmaxl (long double @var{x}, long double @var{y})
The @code{fmax} function returns the greater of the two values @var{x}
and @var{y}.

If an argument is NaN, the other argument is returned.  If both arguments
are NaN, NaN is returned.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double fdim (double @var{x}, double @var{y})
@comment math.h
@comment ISO
@deftypefunx float fdimf (float @var{x}, float @var{y})
@comment math.h
@comment ISO
@deftypefunx {long double} fdiml (long double @var{x}, long double @var{y})
The @code{fdim} function returns the positive difference between
@var{x} and @var{y}.  The positive difference is @math{@var{x} -
@var{y}} if @var{x} is greater than @var{y}, and @math{0} otherwise.

If @var{x}, @var{y}, or both are NaN, NaN is returned.
@end deftypefun

@comment math.h
@comment ISO
@deftypefun double fma (double @var{x}, double @var{y}, double @var{z})
@comment math.h
@comment ISO
@deftypefunx float fmaf (float @var{x}, float @var{y}, float @var{z})
@comment math.h
@comment ISO
@deftypefunx {long double} fmal (long double @var{x}, long double @var{y}, long double @var{z})
@cindex butterfly
The @code{fma} function performs floating-point multiply-add.  This is
the operation @math{(@var{x} @mul{} @var{y}) + @var{z}}, but the
intermediate result is not rounded to the destination type.  This can
sometimes improve the precision of a calculation.

This function was introduced because some processors have a special
instruction to perform multiply-add.  The C compiler cannot use it
directly, because the expression @samp{x*y + z} is defined to round the
intermediate result.  @code{fma} lets you choose when you want to round
only once.

@vindex FP_FAST_FMA
On processors which do not implement multiply-add in hardware,
@code{fma} can be very slow since it must avoid intermediate rounding.
@file{math.h} defines the symbols @code{FP_FAST_FMA},
@code{FP_FAST_FMAF}, and @code{FP_FAST_FMAL} when the corresponding
version of @code{fma} is no slower than the expression @samp{x*y + z}.
In the GNU C library, this always means the operation is implemented in
hardware.
@end deftypefun

@node Complex Numbers
@section Complex Numbers
@pindex complex.h
@cindex complex numbers

@w{ISO C99} introduces support for complex numbers in C.  This is done
with a new type qualifier, @code{complex}.  It is a keyword if and only
if @file{complex.h} has been included.  There are three complex types,
corresponding to the three real types:  @code{float complex},
@code{double complex}, and @code{long double complex}.

To construct complex numbers you need a way to indicate the imaginary
part of a number.  There is no standard notation for an imaginary
floating point constant.  Instead, @file{complex.h} defines two macros
that can be used to create complex numbers.

@deftypevr Macro {const float complex} _Complex_I
This macro is a representation of the complex number ``@math{0+1i}''.
Multiplying a real floating-point value by @code{_Complex_I} gives a
complex number whose value is purely imaginary.  You can use this to
construct complex constants:

@smallexample
@math{3.0 + 4.0i} = @code{3.0 + 4.0 * _Complex_I}
@end smallexample

Note that @code{_Complex_I * _Complex_I} has the value @code{-1}, but
the type of that value is @code{complex}.
@end deftypevr

@c Put this back in when gcc supports _Imaginary_I.  It's too confusing.
@ignore
@noindent
Without an optimizing compiler this is more expensive than the use of
@code{_Imaginary_I} but with is better than nothing.  You can avoid all
the hassles if you use the @code{I} macro below if the name is not
problem.

@deftypevr Macro {const float imaginary} _Imaginary_I
This macro is a representation of the value ``@math{1i}''.  I.e., it is
the value for which

@smallexample
_Imaginary_I * _Imaginary_I = -1
@end smallexample

@noindent
The result is not of type @code{float imaginary} but instead @code{float}.
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
@end ignore

@noindent
@code{_Complex_I} is a bit of a mouthful.  @file{complex.h} also defines
a shorter name for the same constant.

@deftypevr Macro {const float complex} I
This macro has exactly the same value as @code{_Complex_I}.  Most of the
time it is preferable.  However, it causes problems if you want to use
the identifier @code{I} for something else.  You can safely write

@smallexample
#include <complex.h>
#undef I
@end smallexample

@noindent
if you need @code{I} for your own purposes.  (In that case we recommend
you also define some other short name for @code{_Complex_I}, such as
@code{J}.)

@ignore
If the implementation does not support the @code{imaginary} types
@code{I} is defined as @code{_Complex_I} which is the second best
solution.  It still can be used in the same way but requires a most
clever compiler to get the same results.
@end ignore
@end deftypevr

@node Operations on Complex
@section Projections, Conjugates, and Decomposing of Complex Numbers
@cindex project complex numbers
@cindex conjugate complex numbers
@cindex decompose complex numbers
@pindex complex.h

@w{ISO C99} also defines functions that perform basic operations on
complex numbers, such as decomposition and conjugation.  The prototypes
for all these functions are in @file{complex.h}.  All functions are
available in three variants, one for each of the three complex types.

@comment complex.h
@comment ISO
@deftypefun double creal (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx float crealf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {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})
@comment complex.h
@comment ISO
@deftypefunx float cimagf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {long double} cimagl (complex long double @var{z})
These functions return the imaginary part of the complex number @var{z}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} conj (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} conjf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} conjl (complex long double @var{z})
These functions return the conjugate value of the complex number
@var{z}.  The conjugate of a complex number has the same real part and a
negated imaginary part.  In other words, @samp{conj(a + bi) = a + -bi}.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun double carg (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx float cargf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {long double} cargl (complex long double @var{z})
These functions return the argument of the complex number @var{z}.
The argument of a complex number is the angle in the complex plane
between the positive real axis and a line passing through zero and the
number.  This angle is measured in the usual fashion and ranges from @math{0}
to @math{2@pi{}}.

@code{carg} has a branch cut along the positive real axis.
@end deftypefun

@comment complex.h
@comment ISO
@deftypefun {complex double} cproj (complex double @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex float} cprojf (complex float @var{z})
@comment complex.h
@comment ISO
@deftypefunx {complex long double} cprojl (complex long double @var{z})
These functions return the projection of the complex value @var{z} onto
the Riemann sphere.  Values with a infinite imaginary part are projected
to positive infinity on the real axis, even if the real part is NaN.  If
the real part is infinite, the result is equivalent to

@smallexample
INFINITY + I * copysign (0.0, cimag (z))
@end smallexample
@end deftypefun

@node Parsing of Numbers
@section Parsing of Numbers
@cindex parsing numbers (in formatted input)
@cindex converting strings to numbers
@cindex number syntax, parsing
@cindex syntax, for reading numbers

This section describes functions for ``reading'' integer and
floating-point numbers from a string.  It may be more convenient in some
cases to use @code{sscanf} or one of the related functions; see
@ref{Formatted Input}.  But often you can make a program more robust by
finding the tokens in the string by hand, then converting the numbers
one by one.

@menu
* Parsing of Integers::         Functions for conversion of integer values.
* Parsing of Floats::           Functions for conversion of floating-point
				 values.
@end menu

@node Parsing of Integers
@subsection Parsing of Integers

@pindex stdlib.h
@pindex wchar.h
The @samp{str} functions are declared in @file{stdlib.h} and those
beginning with @samp{wcs} are declared in @file{wchar.h}.  One might
wonder about the use of @code{restrict} in the prototypes of the
functions in this section.  It is seemingly useless but the @w{ISO C}
standard uses it (for the functions defined there) so we have to do it
as well.

@comment stdlib.h
@comment ISO
@deftypefun {long int} strtol (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
The @code{strtol} (``string-to-long'') function converts the initial
part of @var{string} to a signed integer, which is returned as a value
of type @code{long int}.

This function attempts to decompose @var{string} as follows:

@itemize @bullet
@item
A (possibly empty) sequence of whitespace characters.  Which characters
are whitespace is determined by the @code{isspace} function
(@pxref{Classification of Characters}).  These are discarded.

@item
An optional plus or minus sign (@samp{+} or @samp{-}).

@item
A nonempty sequence of digits in the radix specified by @var{base}.

If @var{base} is zero, decimal radix is assumed unless the series of
digits begins with @samp{0} (specifying octal radix), or @samp{0x} or
@samp{0X} (specifying hexadecimal radix); in other words, the same
syntax used for integer constants in C.

Otherwise @var{base} must have a value between @code{2} and @code{36}.
If @var{base} is @code{16}, the digits may optionally be preceded by
@samp{0x} or @samp{0X}.  If base has no legal value the value returned
is @code{0l} and the global variable @code{errno} is set to @code{EINVAL}.

@item
Any remaining characters in the string.  If @var{tailptr} is not a null
pointer, @code{strtol} stores a pointer to this tail in
@code{*@var{tailptr}}.
@end itemize

If the string is empty, contains only whitespace, or does not contain an
initial substring that has the expected syntax for an integer in the
specified @var{base}, no conversion is performed.  In this case,
@code{strtol} returns a value of zero and the value stored in
@code{*@var{tailptr}} is the value of @var{string}.

In a locale other than the standard @code{"C"} locale, this function
may recognize additional implementation-dependent syntax.

If the string has valid syntax for an integer but the value is not
representable because of overflow, @code{strtol} returns either
@code{LONG_MAX} or @code{LONG_MIN} (@pxref{Range of Type}), as
appropriate for the sign of the value.  It also sets @code{errno}
to @code{ERANGE} to indicate there was overflow.

You should not check for errors by examining the return value of
@code{strtol}, because the string might be a valid representation of
@code{0l}, @code{LONG_MAX}, or @code{LONG_MIN}.  Instead, check whether
@var{tailptr} points to what you expect after the number
(e.g. @code{'\0'} if the string should end after the number).  You also
need to clear @var{errno} before the call and check it afterward, in
case there was overflow.

There is an example at the end of this section.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun {long int} wcstol (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstol} function is equivalent to the @code{strtol} function
in nearly all aspects but handles wide character strings.

The @code{wcstol} function was introduced in @w{Amendment 1} of @w{ISO C90}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun {unsigned long int} strtoul (const char *retrict @var{string}, char **restrict @var{tailptr}, int @var{base})
The @code{strtoul} (``string-to-unsigned-long'') function is like
@code{strtol} except it converts to an @code{unsigned long int} value.
The syntax is the same as described above for @code{strtol}.  The value
returned on overflow is @code{ULONG_MAX} (@pxref{Range of Type}).

If @var{string} depicts a negative number, @code{strtoul} acts the same
as @var{strtol} but casts the result to an unsigned integer.  That means
for example that @code{strtoul} on @code{"-1"} returns @code{ULONG_MAX}
and an input more negative than @code{LONG_MIN} returns
(@code{ULONG_MAX} + 1) / 2.

@code{strtoul} sets @var{errno} to @code{EINVAL} if @var{base} is out of
range, or @code{ERANGE} on overflow.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun {unsigned long int} wcstoul (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstoul} function is equivalent to the @code{strtoul} function
in nearly all aspects but handles wide character strings.

The @code{wcstoul} function was introduced in @w{Amendment 1} of @w{ISO C90}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun {long long int} strtoll (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
The @code{strtoll} function is like @code{strtol} except that it returns
a @code{long long int} value, and accepts numbers with a correspondingly
larger range.

If the string has valid syntax for an integer but the value is not
representable because of overflow, @code{strtoll} returns either
@code{LONG_LONG_MAX} or @code{LONG_LONG_MIN} (@pxref{Range of Type}), as
appropriate for the sign of the value.  It also sets @code{errno} to
@code{ERANGE} to indicate there was overflow.

The @code{strtoll} function was introduced in @w{ISO C99}.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun {long long int} wcstoll (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstoll} function is equivalent to the @code{strtoll} function
in nearly all aspects but handles wide character strings.

The @code{wcstoll} function was introduced in @w{Amendment 1} of @w{ISO C90}.
@end deftypefun

@comment stdlib.h
@comment BSD
@deftypefun {long long int} strtoq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
@code{strtoq} (``string-to-quad-word'') is the BSD name for @code{strtoll}.
@end deftypefun

@comment wchar.h
@comment GNU
@deftypefun {long long int} wcstoq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstoq} function is equivalent to the @code{strtoq} function
in nearly all aspects but handles wide character strings.

The @code{wcstoq} function is a GNU extension.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun {unsigned long long int} strtoull (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
The @code{strtoull} function is related to @code{strtoll} the same way
@code{strtoul} is related to @code{strtol}.

The @code{strtoull} function was introduced in @w{ISO C99}.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun {unsigned long long int} wcstoull (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstoull} function is equivalent to the @code{strtoull} function
in nearly all aspects but handles wide character strings.

The @code{wcstoull} function was introduced in @w{Amendment 1} of @w{ISO C90}.
@end deftypefun

@comment stdlib.h
@comment BSD
@deftypefun {unsigned long long int} strtouq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
@code{strtouq} is the BSD name for @code{strtoull}.
@end deftypefun

@comment wchar.h
@comment GNU
@deftypefun {unsigned long long int} wcstouq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstouq} function is equivalent to the @code{strtouq} function
in nearly all aspects but handles wide character strings.

The @code{wcstouq} function is a GNU extension.
@end deftypefun

@comment inttypes.h
@comment ISO
@deftypefun intmax_t strtoimax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
The @code{strtoimax} function is like @code{strtol} except that it returns
a @code{intmax_t} value, and accepts numbers of a corresponding range.

If the string has valid syntax for an integer but the value is not
representable because of overflow, @code{strtoimax} returns either
@code{INTMAX_MAX} or @code{INTMAX_MIN} (@pxref{Integers}), as
appropriate for the sign of the value.  It also sets @code{errno} to
@code{ERANGE} to indicate there was overflow.

See @ref{Integers} for a description of the @code{intmax_t} type.  The
@code{strtoimax} function was introduced in @w{ISO C99}.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun intmax_t wcstoimax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstoimax} function is equivalent to the @code{strtoimax} function
in nearly all aspects but handles wide character strings.

The @code{wcstoimax} function was introduced in @w{ISO C99}.
@end deftypefun

@comment inttypes.h
@comment ISO
@deftypefun uintmax_t strtoumax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base})
The @code{strtoumax} function is related to @code{strtoimax}
the same way that @code{strtoul} is related to @code{strtol}.

See @ref{Integers} for a description of the @code{intmax_t} type.  The
@code{strtoumax} function was introduced in @w{ISO C99}.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun uintmax_t wcstoumax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base})
The @code{wcstoumax} function is equivalent to the @code{strtoumax} function
in nearly all aspects but handles wide character strings.

The @code{wcstoumax} function was introduced in @w{ISO C99}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun {long int} atol (const char *@var{string})
This function is similar to the @code{strtol} function with a @var{base}
argument of @code{10}, except that it need not detect overflow errors.
The @code{atol} function is provided mostly for compatibility with
existing code; using @code{strtol} is more robust.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun int atoi (const char *@var{string})
This function is like @code{atol}, except that it returns an @code{int}.
The @code{atoi} function is also considered obsolete; use @code{strtol}
instead.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun {long long int} atoll (const char *@var{string})
This function is similar to @code{atol}, except it returns a @code{long
long int}.

The @code{atoll} function was introduced in @w{ISO C99}.  It too is
obsolete (despite having just been added); use @code{strtoll} instead.
@end deftypefun

All the functions mentioned in this section so far do not handle
alternative representations of characters as described in the locale
data.  Some locales specify thousands separator and the way they have to
be used which can help to make large numbers more readable.  To read
such numbers one has to use the @code{scanf} functions with the @samp{'}
flag.

Here is a function which parses a string as a sequence of integers and
returns the sum of them:

@smallexample
int
sum_ints_from_string (char *string)
@{
  int sum = 0;

  while (1) @{
    char *tail;
    int next;

    /* @r{Skip whitespace by hand, to detect the end.}  */
    while (isspace (*string)) string++;
    if (*string == 0)
      break;

    /* @r{There is more nonwhitespace,}  */
    /* @r{so it ought to be another number.}  */
    errno = 0;
    /* @r{Parse it.}  */
    next = strtol (string, &tail, 0);
    /* @r{Add it in, if not overflow.}  */
    if (errno)
      printf ("Overflow\n");
    else
      sum += next;
    /* @r{Advance past it.}  */
    string = tail;
  @}

  return sum;
@}
@end smallexample

@node Parsing of Floats
@subsection Parsing of Floats

@pindex stdlib.h
The @samp{str} functions are declared in @file{stdlib.h} and those
beginning with @samp{wcs} are declared in @file{wchar.h}.  One might
wonder about the use of @code{restrict} in the prototypes of the
functions in this section.  It is seemingly useless but the @w{ISO C}
standard uses it (for the functions defined there) so we have to do it
as well.

@comment stdlib.h
@comment ISO
@deftypefun double strtod (const char *restrict @var{string}, char **restrict @var{tailptr})
The @code{strtod} (``string-to-double'') function converts the initial
part of @var{string} to a floating-point number, which is returned as a
value of type @code{double}.

This function attempts to decompose @var{string} as follows:

@itemize @bullet
@item
A (possibly empty) sequence of whitespace characters.  Which characters
are whitespace is determined by the @code{isspace} function
(@pxref{Classification of Characters}).  These are discarded.

@item
An optional plus or minus sign (@samp{+} or @samp{-}).

@item A floating point number in decimal or hexadecimal format.  The
decimal format is:
@itemize @minus

@item
A nonempty sequence of digits optionally containing a decimal-point
character---normally @samp{.}, but it depends on the locale
(@pxref{General Numeric}).

@item
An optional exponent part, consisting of a character @samp{e} or
@samp{E}, an optional sign, and a sequence of digits.

@end itemize

The hexadecimal format is as follows:
@itemize @minus

@item
A 0x or 0X followed by a nonempty sequence of hexadecimal digits
optionally containing a decimal-point character---normally @samp{.}, but
it depends on the locale (@pxref{General Numeric}).

@item
An optional binary-exponent part, consisting of a character @samp{p} or
@samp{P}, an optional sign, and a sequence of digits.

@end itemize

@item
Any remaining characters in the string.  If @var{tailptr} is not a null
pointer, a pointer to this tail of the string is stored in
@code{*@var{tailptr}}.
@end itemize

If the string is empty, contains only whitespace, or does not contain an
initial substring that has the expected syntax for a floating-point
number, no conversion is performed.  In this case, @code{strtod} returns
a value of zero and the value returned in @code{*@var{tailptr}} is the
value of @var{string}.

In a locale other than the standard @code{"C"} or @code{"POSIX"} locales,
this function may recognize additional locale-dependent syntax.

If the string has valid syntax for a floating-point number but the value
is outside the range of a @code{double}, @code{strtod} will signal
overflow or underflow as described in @ref{Math Error Reporting}.

@code{strtod} recognizes four special input strings.  The strings
@code{"inf"} and @code{"infinity"} are converted to @math{@infinity{}},
or to the largest representable value if the floating-point format
doesn't support infinities.  You can prepend a @code{"+"} or @code{"-"}
to specify the sign.  Case is ignored when scanning these strings.

The strings @code{"nan"} and @code{"nan(@var{chars@dots{}})"} are converted
to NaN.  Again, case is ignored.  If @var{chars@dots{}} are provided, they
are used in some unspecified fashion to select a particular
representation of NaN (there can be several).

Since zero is a valid result as well as the value returned on error, you
should check for errors in the same way as for @code{strtol}, by
examining @var{errno} and @var{tailptr}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun float strtof (const char *@var{string}, char **@var{tailptr})
@comment stdlib.h
@comment ISO
@deftypefunx {long double} strtold (const char *@var{string}, char **@var{tailptr})
These functions are analogous to @code{strtod}, but return @code{float}
and @code{long double} values respectively.  They report errors in the
same way as @code{strtod}.  @code{strtof} can be substantially faster
than @code{strtod}, but has less precision; conversely, @code{strtold}
can be much slower but has more precision (on systems where @code{long
double} is a separate type).

These functions have been GNU extensions and are new to @w{ISO C99}.
@end deftypefun

@comment wchar.h
@comment ISO
@deftypefun double wcstod (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr})
@comment stdlib.h
@comment ISO
@deftypefunx float wcstof (const wchar_t *@var{string}, wchar_t **@var{tailptr})
@comment stdlib.h
@comment ISO
@deftypefunx {long double} wcstold (const wchar_t *@var{string}, wchar_t **@var{tailptr})
The @code{wcstod}, @code{wcstof}, and @code{wcstol} functions are
equivalent in nearly all aspect to the @code{strtod}, @code{strtof}, and
@code{strtold} functions but it handles wide character string.

The @code{wcstod} function was introduced in @w{Amendment 1} of @w{ISO
C90}.  The @code{wcstof} and @code{wcstold} functions were introduced in
@w{ISO C99}.
@end deftypefun

@comment stdlib.h
@comment ISO
@deftypefun double atof (const char *@var{string})
This function is similar to the @code{strtod} function, except that it
need not detect overflow and underflow errors.  The @code{atof} function
is provided mostly for compatibility with existing code; using
@code{strtod} is more robust.
@end deftypefun

The GNU C library also provides @samp{_l} versions of these functions,
which take an additional argument, the locale to use in conversion.
@xref{Parsing of Integers}.

@node System V Number Conversion
@section Old-fashioned System V number-to-string functions

The old @w{System V} C library provided three functions to convert
numbers to strings, with unusual and hard-to-use semantics.  The GNU C
library also provides these functions and some natural extensions.

These functions are only available in glibc and on systems descended
from AT&T Unix.  Therefore, unless these functions do precisely what you
need, it is better to use @code{sprintf}, which is standard.

All these functions are defined in @file{stdlib.h}.

@comment stdlib.h
@comment SVID, Unix98
@deftypefun {char *} ecvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
The function @code{ecvt} converts the floating-point number @var{value}
to a string with at most @var{ndigit} decimal digits.  The
returned string contains no decimal point or sign. The first digit of
the string is non-zero (unless @var{value} is actually zero) and the
last digit is rounded to nearest.  @code{*@var{decpt}} is set to the
index in the string of the first digit after the decimal point.
@code{*@var{neg}} is set to a nonzero value if @var{value} is negative,
zero otherwise.

If @var{ndigit} decimal digits would exceed the precision of a
@code{double} it is reduced to a system-specific value.

The returned string is statically allocated and overwritten by each call
to @code{ecvt}.

If @var{value} is zero, it is implementation defined whether
@code{*@var{decpt}} is @code{0} or @code{1}.

For example: @code{ecvt (12.3, 5, &d, &n)} returns @code{"12300"}
and sets @var{d} to @code{2} and @var{n} to @code{0}.
@end deftypefun

@comment stdlib.h
@comment SVID, Unix98
@deftypefun {char *} fcvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
The function @code{fcvt} is like @code{ecvt}, but @var{ndigit} specifies
the number of digits after the decimal point.  If @var{ndigit} is less
than zero, @var{value} is rounded to the @math{@var{ndigit}+1}'th place to the
left of the decimal point.  For example, if @var{ndigit} is @code{-1},
@var{value} will be rounded to the nearest 10.  If @var{ndigit} is
negative and larger than the number of digits to the left of the decimal
point in @var{value}, @var{value} will be rounded to one significant digit.

If @var{ndigit} decimal digits would exceed the precision of a
@code{double} it is reduced to a system-specific value.

The returned string is statically allocated and overwritten by each call
to @code{fcvt}.
@end deftypefun

@comment stdlib.h
@comment SVID, Unix98
@deftypefun {char *} gcvt (double @var{value}, int @var{ndigit}, char *@var{buf})
@code{gcvt} is functionally equivalent to @samp{sprintf(buf, "%*g",
ndigit, value}.  It is provided only for compatibility's sake.  It
returns @var{buf}.

If @var{ndigit} decimal digits would exceed the precision of a
@code{double} it is reduced to a system-specific value.
@end deftypefun

As extensions, the GNU C library provides versions of these three
functions that take @code{long double} arguments.

@comment stdlib.h
@comment GNU
@deftypefun {char *} qecvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
This function is equivalent to @code{ecvt} except that it takes a
@code{long double} for the first parameter and that @var{ndigit} is
restricted by the precision of a @code{long double}.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun {char *} qfcvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg})
This function is equivalent to @code{fcvt} except that it
takes a @code{long double} for the first parameter and that @var{ndigit} is
restricted by the precision of a @code{long double}.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun {char *} qgcvt (long double @var{value}, int @var{ndigit}, char *@var{buf})
This function is equivalent to @code{gcvt} except that it takes a
@code{long double} for the first parameter and that @var{ndigit} is
restricted by the precision of a @code{long double}.
@end deftypefun


@cindex gcvt_r
The @code{ecvt} and @code{fcvt} functions, and their @code{long double}
equivalents, all return a string located in a static buffer which is
overwritten by the next call to the function.  The GNU C library
provides another set of extended functions which write the converted
string into a user-supplied buffer.  These have the conventional
@code{_r} suffix.

@code{gcvt_r} is not necessary, because @code{gcvt} already uses a
user-supplied buffer.

@comment stdlib.h
@comment GNU
@deftypefun int ecvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len})
The @code{ecvt_r} function is the same as @code{ecvt}, except
that it places its result into the user-specified buffer pointed to by
@var{buf}, with length @var{len}.  The return value is @code{-1} in
case of an error and zero otherwise.

This function is a GNU extension.
@end deftypefun

@comment stdlib.h
@comment SVID, Unix98
@deftypefun int fcvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len})
The @code{fcvt_r} function is the same as @code{fcvt}, except that it
places its result into the user-specified buffer pointed to by
@var{buf}, with length @var{len}.  The return value is @code{-1} in
case of an error and zero otherwise.

This function is a GNU extension.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int qecvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len})
The @code{qecvt_r} function is the same as @code{qecvt}, except
that it places its result into the user-specified buffer pointed to by
@var{buf}, with length @var{len}.  The return value is @code{-1} in
case of an error and zero otherwise.

This function is a GNU extension.
@end deftypefun

@comment stdlib.h
@comment GNU
@deftypefun int qfcvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len})
The @code{qfcvt_r} function is the same as @code{qfcvt}, except
that it places its result into the user-specified buffer pointed to by
@var{buf}, with length @var{len}.  The return value is @code{-1} in
case of an error and zero otherwise.

This function is a GNU extension.
@end deftypefun
