| @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. |
| * Printing of Floats:: Converting floating-point numbers to strings. |
| * 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, @theglibc{} contains C type definitions |
| you can use to declare integers that meet your exact needs. Because the |
| @glibcadj{} 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 |
| |
| @Theglibc{} 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. Similiarly, there |
| are macros such as @code{INTMAX_WIDTH} for the width of these types. |
| Those macros for integer type widths come from TS 18661-1:2014. |
| @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. |
| |
| @deftp {Data Type} div_t |
| @standards{ISO, stdlib.h} |
| 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 |
| |
| @deftypefun div_t div (int @var{numerator}, int @var{denominator}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Functions in this section are pure, and thus safe. |
| The 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 |
| |
| @deftp {Data Type} ldiv_t |
| @standards{ISO, stdlib.h} |
| 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 |
| |
| @deftypefun ldiv_t ldiv (long int @var{numerator}, long int @var{denominator}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftp {Data Type} lldiv_t |
| @standards{ISO, stdlib.h} |
| 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 |
| |
| @deftypefun lldiv_t lldiv (long long int @var{numerator}, long long int @var{denominator}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftp {Data Type} imaxdiv_t |
| @standards{ISO, inttypes.h} |
| 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 |
| |
| @deftypefun imaxdiv_t imaxdiv (intmax_t @var{numerator}, intmax_t @var{denominator}) |
| @standards{ISO, inttypes.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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. |
| |
| @deftypefn {Macro} int fpclassify (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| @standards{C99, math.h} |
| The floating-point number @var{x} is ``Not a Number'' (@pxref{Infinity |
| and NaN}) |
| @item FP_INFINITE |
| @standards{C99, math.h} |
| The value of @var{x} is either plus or minus infinity (@pxref{Infinity |
| and NaN}) |
| @item FP_ZERO |
| @standards{C99, math.h} |
| 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 |
| @standards{C99, math.h} |
| 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 |
| @standards{C99, math.h} |
| 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. |
| |
| @deftypefn {Macro} int iscanonical (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| In some floating-point formats, some values have canonical (preferred) |
| and noncanonical encodings (for IEEE interchange binary formats, all |
| encodings are canonical). This macro returns a nonzero value if |
| @var{x} has a canonical encoding. It is from TS 18661-1:2014. |
| |
| Note that some formats have multiple encodings of a value which are |
| all equally canonical; @code{iscanonical} returns a nonzero value for |
| all such encodings. Also, formats may have encodings that do not |
| correspond to any valid value of the type. In ISO C terms these are |
| @dfn{trap representations}; in @theglibc{}, @code{iscanonical} returns |
| zero for such encodings. |
| @end deftypefn |
| |
| @deftypefn {Macro} int isfinite (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn {Macro} int isnormal (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn {Macro} int isnan (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro returns a nonzero value if @var{x} is NaN. It is equivalent |
| to |
| |
| @smallexample |
| (fpclassify (x) == FP_NAN) |
| @end smallexample |
| @end deftypefn |
| |
| @deftypefn {Macro} int issignaling (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro returns a nonzero value if @var{x} is a signaling NaN |
| (sNaN). It is from TS 18661-1:2014. |
| @end deftypefn |
| |
| @deftypefn {Macro} int issubnormal (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro returns a nonzero value if @var{x} is subnormal. It is |
| from TS 18661-1:2014. |
| @end deftypefn |
| |
| @deftypefn {Macro} int iszero (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro returns a nonzero value if @var{x} is zero. It is from TS |
| 18661-1:2014. |
| @end deftypefn |
| |
| Another set of floating-point classification functions was provided by |
| BSD. @Theglibc{} 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. |
| |
| @deftypefun int isinf (double @var{x}) |
| @deftypefunx int isinff (float @var{x}) |
| @deftypefunx int isinfl (long double @var{x}) |
| @standards{BSD, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int isnan (double @var{x}) |
| @deftypefunx int isnanf (float @var{x}) |
| @deftypefunx int isnanl (long double @var{x}) |
| @standards{BSD, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int finite (double @var{x}) |
| @deftypefunx int finitef (float @var{x}) |
| @deftypefunx int finitel (long double @var{x}) |
| @standards{BSD, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This function returns a nonzero value if @var{x} is neither infinite nor |
| 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. |
| |
| @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 than 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. |
| |
| @deftypevr Macro float INFINITY |
| @standards{ISO, math.h} |
| 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 |
| |
| @deftypevr Macro float NAN |
| @standards{GNU, math.h} |
| 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 |
| |
| @deftypevr Macro float SNANF |
| @deftypevrx Macro double SNAN |
| @deftypevrx Macro {long double} SNANL |
| @deftypevrx Macro _FloatN SNANFN |
| @deftypevrx Macro _FloatNx SNANFNx |
| @standards{TS 18661-1:2014, math.h} |
| @standardsx{SNANFN, TS 18661-3:2015, math.h} |
| @standardsx{SNANFNx, TS 18661-3:2015, math.h} |
| These macros, defined by TS 18661-1:2014 and TS 18661-3:2015, are |
| constant expressions for signaling NaNs. |
| @end deftypevr |
| |
| @deftypevr Macro int FE_SNANS_ALWAYS_SIGNAL |
| @standards{ISO, fenv.h} |
| This macro, defined by TS 18661-1:2014, is defined to @code{1} in |
| @file{fenv.h} to indicate that functions and operations with signaling |
| NaN inputs and floating-point results always raise the invalid |
| exception and return a quiet NaN, even in cases (such as @code{fmax}, |
| @code{hypot} and @code{pow}) where a quiet NaN input can produce a |
| non-NaN result. Because some compiler optimizations may not handle |
| signaling NaNs correctly, this macro is only defined if compiler |
| support for signaling NaNs is enabled. That support can be enabled |
| with the GCC option @option{-fsignaling-nans}. |
| @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. |
| |
| @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 |
| @item FE_INEXACT |
| @standards{ISO, fenv.h} |
| The inexact exception. |
| @item FE_DIVBYZERO |
| @standards{ISO, fenv.h} |
| The divide by zero exception. |
| @item FE_UNDERFLOW |
| @standards{ISO, fenv.h} |
| The underflow exception. |
| @item FE_OVERFLOW |
| @standards{ISO, fenv.h} |
| The overflow exception. |
| @item FE_INVALID |
| @standards{ISO, fenv.h} |
| 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. |
| |
| @deftypefun int feclearexcept (int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{@assposix{}}@acsafe{@acsposix{}}} |
| @c The other functions in this section that modify FP status register |
| @c mostly do so with non-atomic load-modify-store sequences, but since |
| @c the register is thread-specific, this should be fine, and safe for |
| @c cancellation. As long as the FP environment is restored before the |
| @c signal handler returns control to the interrupted thread (like any |
| @c kernel should do), the functions are also safe for use in signal |
| @c handlers. |
| 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 |
| |
| @deftypefun int feraiseexcept (int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int fesetexcept (int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This function sets the supported exception flags indicated by |
| @var{excepts}, like @code{feraiseexcept}, but without causing enabled |
| traps to be taken. @code{fesetexcept} is from TS 18661-1:2014. |
| |
| The function returns zero in case the operation was successful, a |
| non-zero value otherwise. |
| @end deftypefun |
| |
| @deftypefun int fetestexcept (int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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: |
| |
| @deftypefun int fegetexceptflag (fexcept_t *@var{flagp}, int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int fesetexceptflag (const fexcept_t *@var{flagp}, int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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. |
| |
| @deftypefun int fetestexceptflag (const fexcept_t *@var{flagp}, int @var{excepts}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| Test whether the exception flags indicated by the parameter |
| @var{excepts} are set in the variable pointed to by @var{flagp}. If |
| any of them are, a nonzero value is returned which specifies which |
| exceptions are set. Otherwise the result is zero. |
| @code{fetestexceptflag} is from TS 18661-1:2014. |
| @end deftypefun |
| |
| @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 without loss of accuracy. 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, in the default rounding |
| mode, return @math{@infinity{}} or @math{-@infinity{}} as appropriate |
| (in other rounding modes, the largest finite value of the appropriate |
| sign is returned when appropriate for that rounding mode). They also |
| set @var{errno} to @code{ERANGE} if returning @math{@infinity{}} or |
| @math{-@infinity{}}; @var{errno} may or may not be set to |
| @code{ERANGE} when a finite value is returned on overflow. When |
| underflow occurs, the underflow exception is raised, and zero |
| (appropriately signed) or a subnormal value, as appropriate for the |
| mathematical result of the function and the rounding mode, is |
| returned. @var{errno} may be set to @code{ERANGE}, but this is not |
| guaranteed; it is intended that @theglibc{} should set it when the |
| underflow is to an appropriately signed zero, but not necessarily for |
| other underflows. |
| |
| When a math function has an argument that is a signaling NaN, |
| @theglibc{} does not consider this a domain error, so @code{errno} is |
| unchanged, but the invalid exception is still raised (except for a few |
| functions that are specified to handle signaling NaNs differently). |
| |
| 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. |
| |
| @deftypevr Macro double HUGE_VAL |
| @deftypevrx Macro float HUGE_VALF |
| @deftypevrx Macro {long double} HUGE_VALL |
| @deftypevrx Macro _FloatN HUGE_VAL_FN |
| @deftypevrx Macro _FloatNx HUGE_VAL_FNx |
| @standards{ISO, math.h} |
| @standardsx{HUGE_VAL_FN, TS 18661-3:2015, math.h} |
| @standardsx{HUGE_VAL_FNx, TS 18661-3:2015, math.h} |
| 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. |
| |
| @vtable @code |
| @item FE_TONEAREST |
| @standards{ISO, fenv.h} |
| Round to nearest. |
| |
| @item FE_UPWARD |
| @standards{ISO, fenv.h} |
| Round toward @math{+@infinity{}}. |
| |
| @item FE_DOWNWARD |
| @standards{ISO, fenv.h} |
| Round toward @math{-@infinity{}}. |
| |
| @item FE_TOWARDZERO |
| @standards{ISO, fenv.h} |
| Round toward zero. |
| @end vtable |
| |
| 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{}}. |
| |
| At any time, one of the above four rounding modes is selected. You can |
| find out which one with this function: |
| |
| @deftypefun int fegetround (void) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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: |
| |
| @deftypefun int fesetround (int @var{round}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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, or 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: |
| |
| @deftypefun int fegetenv (fenv_t *@var{envp}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int feholdexcept (fenv_t *@var{envp}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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, @theglibc{} 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: |
| |
| @deftypefun int fesetenv (const fenv_t *@var{envp}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int feupdateenv (const fenv_t *@var{envp}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| TS 18661-1:2014 defines additional functions to save and restore |
| floating-point control modes (such as the rounding mode and whether |
| traps are enabled) while leaving other status (such as raised flags) |
| unchanged. |
| |
| @vindex FE_DFL_MODE |
| The special macro @code{FE_DFL_MODE} may be passed to |
| @code{fesetmode}. It represents the floating-point control modes at |
| program start. |
| |
| @deftypefun int fegetmode (femode_t *@var{modep}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| Store the floating-point control modes in the variable pointed to by |
| @var{modep}. |
| |
| The function returns zero in case the operation was successful, a |
| non-zero value otherwise. |
| @end deftypefun |
| |
| @deftypefun int fesetmode (const femode_t *@var{modep}) |
| @standards{ISO, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| Set the floating-point control modes to those described by |
| @var{modep}. |
| |
| 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. |
| |
| @deftypefun int feenableexcept (int @var{excepts}) |
| @standards{GNU, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This function enables traps for each of the exceptions as indicated by |
| the parameter @var{excepts}. The individual exceptions 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 |
| |
| @deftypefun int fedisableexcept (int @var{excepts}) |
| @standards{GNU, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This function disables traps for each of the exceptions as indicated by |
| the parameter @var{excepts}. The individual exceptions 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 |
| |
| @deftypefun int fegetexcept (void) |
| @standards{GNU, fenv.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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}; |
| the @code{fabs} functions are declared in @file{math.h}; |
| the @code{cabs} functions are declared in @file{complex.h}. |
| |
| @deftypefun int abs (int @var{number}) |
| @deftypefunx {long int} labs (long int @var{number}) |
| @deftypefunx {long long int} llabs (long long int @var{number}) |
| @deftypefunx intmax_t imaxabs (intmax_t @var{number}) |
| @standards{ISO, stdlib.h} |
| @standardsx{imaxabs, ISO, inttypes.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double fabs (double @var{number}) |
| @deftypefunx float fabsf (float @var{number}) |
| @deftypefunx {long double} fabsl (long double @var{number}) |
| @deftypefunx _FloatN fabsfN (_Float@var{N} @var{number}) |
| @deftypefunx _FloatNx fabsfNx (_Float@var{N}x @var{number}) |
| @standards{ISO, math.h} |
| @standardsx{fabsfN, TS 18661-3:2015, math.h} |
| @standardsx{fabsfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This function returns the absolute value of the floating-point number |
| @var{number}. |
| @end deftypefun |
| |
| @deftypefun double cabs (complex double @var{z}) |
| @deftypefunx float cabsf (complex float @var{z}) |
| @deftypefunx {long double} cabsl (complex long double @var{z}) |
| @deftypefunx _FloatN cabsfN (complex _Float@var{N} @var{z}) |
| @deftypefunx _FloatNx cabsfNx (complex _Float@var{N}x @var{z}) |
| @standards{ISO, complex.h} |
| @standardsx{cabsfN, TS 18661-3:2015, complex.h} |
| @standardsx{cabsfNx, TS 18661-3:2015, complex.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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}. |
| |
| @deftypefun double frexp (double @var{value}, int *@var{exponent}) |
| @deftypefunx float frexpf (float @var{value}, int *@var{exponent}) |
| @deftypefunx {long double} frexpl (long double @var{value}, int *@var{exponent}) |
| @deftypefunx _FloatN frexpfN (_Float@var{N} @var{value}, int *@var{exponent}) |
| @deftypefunx _FloatNx frexpfNx (_Float@var{N}x @var{value}, int *@var{exponent}) |
| @standards{ISO, math.h} |
| @standardsx{frexpfN, TS 18661-3:2015, math.h} |
| @standardsx{frexpfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 its magnitude 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 |
| |
| @deftypefun double ldexp (double @var{value}, int @var{exponent}) |
| @deftypefunx float ldexpf (float @var{value}, int @var{exponent}) |
| @deftypefunx {long double} ldexpl (long double @var{value}, int @var{exponent}) |
| @deftypefunx _FloatN ldexpfN (_Float@var{N} @var{value}, int @var{exponent}) |
| @deftypefunx _FloatNx ldexpfNx (_Float@var{N}x @var{value}, int @var{exponent}) |
| @standards{ISO, math.h} |
| @standardsx{ldexpfN, TS 18661-3:2015, math.h} |
| @standardsx{ldexpfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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. |
| The @code{_Float@var{N}} and @code{_Float@var{N}} variants of the |
| following functions come from TS 18661-3:2015. |
| |
| @deftypefun double scalb (double @var{value}, double @var{exponent}) |
| @deftypefunx float scalbf (float @var{value}, float @var{exponent}) |
| @deftypefunx {long double} scalbl (long double @var{value}, long double @var{exponent}) |
| @standards{BSD, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| The @code{scalb} function is the BSD name for @code{ldexp}. |
| @end deftypefun |
| |
| @deftypefun double scalbn (double @var{x}, int @var{n}) |
| @deftypefunx float scalbnf (float @var{x}, int @var{n}) |
| @deftypefunx {long double} scalbnl (long double @var{x}, int @var{n}) |
| @deftypefunx _FloatN scalbnfN (_Float@var{N} @var{x}, int @var{n}) |
| @deftypefunx _FloatNx scalbnfNx (_Float@var{N}x @var{x}, int @var{n}) |
| @standards{BSD, math.h} |
| @standardsx{scalbnfN, TS 18661-3:2015, math.h} |
| @standardsx{scalbnfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @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 |
| |
| @deftypefun double scalbln (double @var{x}, long int @var{n}) |
| @deftypefunx float scalblnf (float @var{x}, long int @var{n}) |
| @deftypefunx {long double} scalblnl (long double @var{x}, long int @var{n}) |
| @deftypefunx _FloatN scalblnfN (_Float@var{N} @var{x}, long int @var{n}) |
| @deftypefunx _FloatNx scalblnfNx (_Float@var{N}x @var{x}, long int @var{n}) |
| @standards{BSD, math.h} |
| @standardsx{scalblnfN, TS 18661-3:2015, math.h} |
| @standardsx{scalblnfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @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 |
| |
| @deftypefun double significand (double @var{x}) |
| @deftypefunx float significandf (float @var{x}) |
| @deftypefunx {long double} significandl (long double @var{x}) |
| @standards{BSD, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @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. |
| |
| The @code{fromfp} functions use the following macros, from TS |
| 18661-1:2014, to specify the direction of rounding. These correspond |
| to the rounding directions defined in IEEE 754-2008. |
| |
| @vtable @code |
| @item FP_INT_UPWARD |
| @standards{ISO, math.h} |
| Round toward @math{+@infinity{}}. |
| |
| @item FP_INT_DOWNWARD |
| @standards{ISO, math.h} |
| Round toward @math{-@infinity{}}. |
| |
| @item FP_INT_TOWARDZERO |
| @standards{ISO, math.h} |
| Round toward zero. |
| |
| @item FP_INT_TONEARESTFROMZERO |
| @standards{ISO, math.h} |
| Round to nearest, ties round away from zero. |
| |
| @item FP_INT_TONEAREST |
| @standards{ISO, math.h} |
| Round to nearest, ties round to even. |
| @end vtable |
| |
| @deftypefun double ceil (double @var{x}) |
| @deftypefunx float ceilf (float @var{x}) |
| @deftypefunx {long double} ceill (long double @var{x}) |
| @deftypefunx _FloatN ceilfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx ceilfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{ceilfN, TS 18661-3:2015, math.h} |
| @standardsx{ceilfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double floor (double @var{x}) |
| @deftypefunx float floorf (float @var{x}) |
| @deftypefunx {long double} floorl (long double @var{x}) |
| @deftypefunx _FloatN floorfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx floorfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{floorfN, TS 18661-3:2015, math.h} |
| @standardsx{floorfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double trunc (double @var{x}) |
| @deftypefunx float truncf (float @var{x}) |
| @deftypefunx {long double} truncl (long double @var{x}) |
| @deftypefunx _FloatN truncfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx truncfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{truncfN, TS 18661-3:2015, math.h} |
| @standardsx{truncfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double rint (double @var{x}) |
| @deftypefunx float rintf (float @var{x}) |
| @deftypefunx {long double} rintl (long double @var{x}) |
| @deftypefunx _FloatN rintfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx rintfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{rintfN, TS 18661-3:2015, math.h} |
| @standardsx{rintfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double nearbyint (double @var{x}) |
| @deftypefunx float nearbyintf (float @var{x}) |
| @deftypefunx {long double} nearbyintl (long double @var{x}) |
| @deftypefunx _FloatN nearbyintfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx nearbyintfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{nearbyintfN, TS 18661-3:2015, math.h} |
| @standardsx{nearbyintfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double round (double @var{x}) |
| @deftypefunx float roundf (float @var{x}) |
| @deftypefunx {long double} roundl (long double @var{x}) |
| @deftypefunx _FloatN roundfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx roundfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{roundfN, TS 18661-3:2015, math.h} |
| @standardsx{roundfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double roundeven (double @var{x}) |
| @deftypefunx float roundevenf (float @var{x}) |
| @deftypefunx {long double} roundevenl (long double @var{x}) |
| @deftypefunx _FloatN roundevenfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx roundevenfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{roundevenfN, TS 18661-3:2015, math.h} |
| @standardsx{roundevenfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions, from TS 18661-1:2014 and TS 18661-3:2015, are similar |
| to @code{round}, but they round halfway cases to even instead of away |
| from zero. |
| @end deftypefun |
| |
| @deftypefun {long int} lrint (double @var{x}) |
| @deftypefunx {long int} lrintf (float @var{x}) |
| @deftypefunx {long int} lrintl (long double @var{x}) |
| @deftypefunx {long int} lrintfN (_Float@var{N} @var{x}) |
| @deftypefunx {long int} lrintfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{lrintfN, TS 18661-3:2015, math.h} |
| @standardsx{lrintfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions are just like @code{rint}, but they return a |
| @code{long int} instead of a floating-point number. |
| @end deftypefun |
| |
| @deftypefun {long long int} llrint (double @var{x}) |
| @deftypefunx {long long int} llrintf (float @var{x}) |
| @deftypefunx {long long int} llrintl (long double @var{x}) |
| @deftypefunx {long long int} llrintfN (_Float@var{N} @var{x}) |
| @deftypefunx {long long int} llrintfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{llrintfN, TS 18661-3:2015, math.h} |
| @standardsx{llrintfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions are just like @code{rint}, but they return a |
| @code{long long int} instead of a floating-point number. |
| @end deftypefun |
| |
| @deftypefun {long int} lround (double @var{x}) |
| @deftypefunx {long int} lroundf (float @var{x}) |
| @deftypefunx {long int} lroundl (long double @var{x}) |
| @deftypefunx {long int} lroundfN (_Float@var{N} @var{x}) |
| @deftypefunx {long int} lroundfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{lroundfN, TS 18661-3:2015, math.h} |
| @standardsx{lroundfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions are just like @code{round}, but they return a |
| @code{long int} instead of a floating-point number. |
| @end deftypefun |
| |
| @deftypefun {long long int} llround (double @var{x}) |
| @deftypefunx {long long int} llroundf (float @var{x}) |
| @deftypefunx {long long int} llroundl (long double @var{x}) |
| @deftypefunx {long long int} llroundfN (_Float@var{N} @var{x}) |
| @deftypefunx {long long int} llroundfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{llroundfN, TS 18661-3:2015, math.h} |
| @standardsx{llroundfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions are just like @code{round}, but they return a |
| @code{long long int} instead of a floating-point number. |
| @end deftypefun |
| |
| @deftypefun intmax_t fromfp (double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpf (float @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpl (long double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpfN (_Float@var{N} @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpfNx (_Float@var{N}x @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfp (double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpf (float @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpl (long double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpfN (_Float@var{N} @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpfNx (_Float@var{N}x @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpx (double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpxf (float @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpxl (long double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpxfN (_Float@var{N} @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx intmax_t fromfpxfNx (_Float@var{N}x @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpx (double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpxf (float @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpxl (long double @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpxfN (_Float@var{N} @var{x}, int @var{round}, unsigned int @var{width}) |
| @deftypefunx uintmax_t ufromfpxfNx (_Float@var{N}x @var{x}, int @var{round}, unsigned int @var{width}) |
| @standards{ISO, math.h} |
| @standardsx{fromfpfN, TS 18661-3:2015, math.h} |
| @standardsx{fromfpfNx, TS 18661-3:2015, math.h} |
| @standardsx{ufromfpfN, TS 18661-3:2015, math.h} |
| @standardsx{ufromfpfNx, TS 18661-3:2015, math.h} |
| @standardsx{fromfpxfN, TS 18661-3:2015, math.h} |
| @standardsx{fromfpxfNx, TS 18661-3:2015, math.h} |
| @standardsx{ufromfpxfN, TS 18661-3:2015, math.h} |
| @standardsx{ufromfpxfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions, from TS 18661-1:2014 and TS 18661-3:2015, convert a |
| floating-point number to an integer according to the rounding direction |
| @var{round} (one of the @code{FP_INT_*} macros). If the integer is |
| outside the range of a signed or unsigned (depending on the return type |
| of the function) type of width @var{width} bits (or outside the range of |
| the return type, if @var{width} is larger), or if @var{x} is infinite or |
| NaN, or if @var{width} is zero, a domain error occurs and an unspecified |
| value is returned. The functions with an @samp{x} in their names raise |
| the inexact exception when a domain error does not occur and the |
| argument is not an integer; the other functions do not raise the inexact |
| exception. |
| @end deftypefun |
| |
| |
| @deftypefun double modf (double @var{value}, double *@var{integer-part}) |
| @deftypefunx float modff (float @var{value}, float *@var{integer-part}) |
| @deftypefunx {long double} modfl (long double @var{value}, long double *@var{integer-part}) |
| @deftypefunx _FloatN modffN (_Float@var{N} @var{value}, _Float@var{N} *@var{integer-part}) |
| @deftypefunx _FloatNx modffNx (_Float@var{N}x @var{value}, _Float@var{N}x *@var{integer-part}) |
| @standards{ISO, math.h} |
| @standardsx{modffN, TS 18661-3:2015, math.h} |
| @standardsx{modffNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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. |
| |
| @deftypefun double fmod (double @var{numerator}, double @var{denominator}) |
| @deftypefunx float fmodf (float @var{numerator}, float @var{denominator}) |
| @deftypefunx {long double} fmodl (long double @var{numerator}, long double @var{denominator}) |
| @deftypefunx _FloatN fmodfN (_Float@var{N} @var{numerator}, _Float@var{N} @var{denominator}) |
| @deftypefunx _FloatNx fmodfNx (_Float@var{N}x @var{numerator}, _Float@var{N}x @var{denominator}) |
| @standards{ISO, math.h} |
| @standardsx{fmodfN, TS 18661-3:2015, math.h} |
| @standardsx{fmodfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double remainder (double @var{numerator}, double @var{denominator}) |
| @deftypefunx float remainderf (float @var{numerator}, float @var{denominator}) |
| @deftypefunx {long double} remainderl (long double @var{numerator}, long double @var{denominator}) |
| @deftypefunx _FloatN remainderfN (_Float@var{N} @var{numerator}, _Float@var{N} @var{denominator}) |
| @deftypefunx _FloatNx remainderfNx (_Float@var{N}x @var{numerator}, _Float@var{N}x @var{denominator}) |
| @standards{ISO, math.h} |
| @standardsx{remainderfN, TS 18661-3:2015, math.h} |
| @standardsx{remainderfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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{remainder (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{remainder |
| (@var{numerator}, @var{denominator})} is always either |
| @var{denominator}, minus @var{denominator}, or zero. |
| |
| If @var{denominator} is zero, @code{remainder} signals a domain error. |
| @end deftypefun |
| |
| @deftypefun double drem (double @var{numerator}, double @var{denominator}) |
| @deftypefunx float dremf (float @var{numerator}, float @var{denominator}) |
| @deftypefunx {long double} dreml (long double @var{numerator}, long double @var{denominator}) |
| @standards{BSD, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This function is another name for @code{remainder}. |
| @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. |
| |
| @deftypefun double copysign (double @var{x}, double @var{y}) |
| @deftypefunx float copysignf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} copysignl (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN copysignfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx copysignfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{copysignfN, TS 18661-3:2015, math.h} |
| @standardsx{copysignfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int signbit (@emph{float-type} @var{x}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @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 |
| |
| @deftypefun double nextafter (double @var{x}, double @var{y}) |
| @deftypefunx float nextafterf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} nextafterl (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN nextafterfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx nextafterfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{nextafterfN, TS 18661-3:2015, math.h} |
| @standardsx{nextafterfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double nexttoward (double @var{x}, long double @var{y}) |
| @deftypefunx float nexttowardf (float @var{x}, long double @var{y}) |
| @deftypefunx {long double} nexttowardl (long double @var{x}, long double @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions are identical to the corresponding versions of |
| @code{nextafter} except that their second argument is a @code{long |
| double}. |
| @end deftypefun |
| |
| @deftypefun double nextup (double @var{x}) |
| @deftypefunx float nextupf (float @var{x}) |
| @deftypefunx {long double} nextupl (long double @var{x}) |
| @deftypefunx _FloatN nextupfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx nextupfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{nextupfN, TS 18661-3:2015, math.h} |
| @standardsx{nextupfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| The @code{nextup} function returns the next representable neighbor of @var{x} |
| in the direction of positive infinity. If @var{x} is the smallest negative |
| subnormal number in the type of @var{x} the function returns @code{-0}. If |
| @math{@var{x} = @code{0}} the function returns the smallest positive subnormal |
| number in the type of @var{x}. If @var{x} is NaN, NaN is returned. |
| If @var{x} is @math{+@infinity{}}, @math{+@infinity{}} is returned. |
| @code{nextup} is from TS 18661-1:2014 and TS 18661-3:2015. |
| @code{nextup} never raises an exception except for signaling NaNs. |
| @end deftypefun |
| |
| @deftypefun double nextdown (double @var{x}) |
| @deftypefunx float nextdownf (float @var{x}) |
| @deftypefunx {long double} nextdownl (long double @var{x}) |
| @deftypefunx _FloatN nextdownfN (_Float@var{N} @var{x}) |
| @deftypefunx _FloatNx nextdownfNx (_Float@var{N}x @var{x}) |
| @standards{ISO, math.h} |
| @standardsx{nextdownfN, TS 18661-3:2015, math.h} |
| @standardsx{nextdownfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| The @code{nextdown} function returns the next representable neighbor of @var{x} |
| in the direction of negative infinity. If @var{x} is the smallest positive |
| subnormal number in the type of @var{x} the function returns @code{+0}. If |
| @math{@var{x} = @code{0}} the function returns the smallest negative subnormal |
| number in the type of @var{x}. If @var{x} is NaN, NaN is returned. |
| If @var{x} is @math{-@infinity{}}, @math{-@infinity{}} is returned. |
| @code{nextdown} is from TS 18661-1:2014 and TS 18661-3:2015. |
| @code{nextdown} never raises an exception except for signaling NaNs. |
| @end deftypefun |
| |
| @cindex NaN |
| @deftypefun double nan (const char *@var{tagp}) |
| @deftypefunx float nanf (const char *@var{tagp}) |
| @deftypefunx {long double} nanl (const char *@var{tagp}) |
| @deftypefunx _FloatN nanfN (const char *@var{tagp}) |
| @deftypefunx _FloatNx nanfNx (const char *@var{tagp}) |
| @standards{ISO, math.h} |
| @standardsx{nanfN, TS 18661-3:2015, math.h} |
| @standardsx{nanfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @c The unsafe-but-ruled-safe locale use comes from strtod. |
| 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 |
| |
| @deftypefun int canonicalize (double *@var{cx}, const double *@var{x}) |
| @deftypefunx int canonicalizef (float *@var{cx}, const float *@var{x}) |
| @deftypefunx int canonicalizel (long double *@var{cx}, const long double *@var{x}) |
| @deftypefunx int canonicalizefN (_Float@var{N} *@var{cx}, const _Float@var{N} *@var{x}) |
| @deftypefunx int canonicalizefNx (_Float@var{N}x *@var{cx}, const _Float@var{N}x *@var{x}) |
| @standards{ISO, math.h} |
| @standardsx{canonicalizefN, TS 18661-3:2015, math.h} |
| @standardsx{canonicalizefNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| In some floating-point formats, some values have canonical (preferred) |
| and noncanonical encodings (for IEEE interchange binary formats, all |
| encodings are canonical). These functions, defined by TS |
| 18661-1:2014 and TS 18661-3:2015, attempt to produce a canonical version |
| of the floating-point value pointed to by @var{x}; if that value is a |
| signaling NaN, they raise the invalid exception and produce a quiet |
| NaN. If a canonical value is produced, it is stored in the object |
| pointed to by @var{cx}, and these functions return zero. Otherwise |
| (if a canonical value could not be produced because the object pointed |
| to by @var{x} is not a valid representation of any floating-point |
| value), the object pointed to by @var{cx} is unchanged and a nonzero |
| value is returned. |
| |
| Note that some formats have multiple encodings of a value which are |
| all equally canonical; when such an encoding is used as an input to |
| this function, any such encoding of the same value (or of the |
| corresponding quiet NaN, if that value is a signaling NaN) may be |
| produced as output. |
| @end deftypefun |
| |
| @deftypefun double getpayload (const double *@var{x}) |
| @deftypefunx float getpayloadf (const float *@var{x}) |
| @deftypefunx {long double} getpayloadl (const long double *@var{x}) |
| @deftypefunx _FloatN getpayloadfN (const _Float@var{N} *@var{x}) |
| @deftypefunx _FloatNx getpayloadfNx (const _Float@var{N}x *@var{x}) |
| @standards{ISO, math.h} |
| @standardsx{getpayloadfN, TS 18661-3:2015, math.h} |
| @standardsx{getpayloadfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| IEEE 754 defines the @dfn{payload} of a NaN to be an integer value |
| encoded in the representation of the NaN. Payloads are typically |
| propagated from NaN inputs to the result of a floating-point |
| operation. These functions, defined by TS 18661-1:2014 and TS |
| 18661-3:2015, return the payload of the NaN pointed to by @var{x} |
| (returned as a positive integer, or positive zero, represented as a |
| floating-point number); if @var{x} is not a NaN, they return an |
| unspecified value. They raise no floating-point exceptions even for |
| signaling NaNs. |
| @end deftypefun |
| |
| @deftypefun int setpayload (double *@var{x}, double @var{payload}) |
| @deftypefunx int setpayloadf (float *@var{x}, float @var{payload}) |
| @deftypefunx int setpayloadl (long double *@var{x}, long double @var{payload}) |
| @deftypefunx int setpayloadfN (_Float@var{N} *@var{x}, _Float@var{N} @var{payload}) |
| @deftypefunx int setpayloadfNx (_Float@var{N}x *@var{x}, _Float@var{N}x @var{payload}) |
| @standards{ISO, math.h} |
| @standardsx{setpayloadfN, TS 18661-3:2015, math.h} |
| @standardsx{setpayloadfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions, defined by TS 18661-1:2014 and TS 18661-3:2015, set the |
| object pointed to by @var{x} to a quiet NaN with payload @var{payload} |
| and a zero sign bit and return zero. If @var{payload} is not a |
| positive-signed integer that is a valid payload for a quiet NaN of the |
| given type, the object pointed to by @var{x} is set to positive zero and |
| a nonzero value is returned. They raise no floating-point exceptions. |
| @end deftypefun |
| |
| @deftypefun int setpayloadsig (double *@var{x}, double @var{payload}) |
| @deftypefunx int setpayloadsigf (float *@var{x}, float @var{payload}) |
| @deftypefunx int setpayloadsigl (long double *@var{x}, long double @var{payload}) |
| @deftypefunx int setpayloadsigfN (_Float@var{N} *@var{x}, _Float@var{N} @var{payload}) |
| @deftypefunx int setpayloadsigfNx (_Float@var{N}x *@var{x}, _Float@var{N}x @var{payload}) |
| @standards{ISO, math.h} |
| @standardsx{setpayloadsigfN, TS 18661-3:2015, math.h} |
| @standardsx{setpayloadsigfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions, defined by TS 18661-1:2014 and TS 18661-3:2015, set the |
| object pointed to by @var{x} to a signaling NaN with payload |
| @var{payload} and a zero sign bit and return zero. If @var{payload} is |
| not a positive-signed integer that is a valid payload for a signaling |
| NaN of the given type, the object pointed to by @var{x} is set to |
| positive zero and a nonzero value is returned. They raise no |
| floating-point exceptions. |
| @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. TS 18661-1:2014 adds such a macro for an |
| equality comparison that @emph{does} raise an exception for a NaN |
| argument; it also adds functions that provide a total ordering on all |
| floating-point values, including NaNs, without raising any exceptions |
| even for signaling NaNs. |
| |
| @deftypefn Macro int isgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn Macro int isgreaterequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn Macro int isless (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn Macro int islessequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn Macro int islessgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn Macro int isunordered (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefn Macro int iseqsig (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) |
| @standards{ISO, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| This macro determines whether its arguments are equal. It is |
| equivalent to @code{(@var{x}) == (@var{y})}, but it raises the invalid |
| exception and sets @code{errno} to @code{EDOM} if either argument is a |
| NaN. |
| @end deftypefn |
| |
| @deftypefun int totalorder (double @var{x}, double @var{y}) |
| @deftypefunx int totalorderf (float @var{x}, float @var{y}) |
| @deftypefunx int totalorderl (long double @var{x}, long double @var{y}) |
| @deftypefunx int totalorderfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx int totalorderfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{TS 18661-1:2014, math.h} |
| @standardsx{totalorderfN, TS 18661-3:2015, math.h} |
| @standardsx{totalorderfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions determine whether the total order relationship, |
| defined in IEEE 754-2008, is true for @var{x} and @var{y}, returning |
| nonzero if it is true and zero if it is false. No exceptions are |
| raised even for signaling NaNs. The relationship is true if they are |
| the same floating-point value (including sign for zero and NaNs, and |
| payload for NaNs), or if @var{x} comes before @var{y} in the following |
| order: negative quiet NaNs, in order of decreasing payload; negative |
| signaling NaNs, in order of decreasing payload; negative infinity; |
| finite numbers, in ascending order, with negative zero before positive |
| zero; positive infinity; positive signaling NaNs, in order of |
| increasing payload; positive quiet NaNs, in order of increasing |
| payload. |
| @end deftypefun |
| |
| @deftypefun int totalordermag (double @var{x}, double @var{y}) |
| @deftypefunx int totalordermagf (float @var{x}, float @var{y}) |
| @deftypefunx int totalordermagl (long double @var{x}, long double @var{y}) |
| @deftypefunx int totalordermagfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx int totalordermagfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{TS 18661-1:2014, math.h} |
| @standardsx{totalordermagfN, TS 18661-3:2015, math.h} |
| @standardsx{totalordermagfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions determine whether the total order relationship, |
| defined in IEEE 754-2008, is true for the absolute values of @var{x} |
| and @var{y}, returning nonzero if it is true and zero if it is false. |
| No exceptions are raised even for signaling NaNs. |
| @end deftypefun |
| |
| 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. |
| |
| @deftypefun double fmin (double @var{x}, double @var{y}) |
| @deftypefunx float fminf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} fminl (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN fminfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx fminfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{fminfN, TS 18661-3:2015, math.h} |
| @standardsx{fminfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double fmax (double @var{x}, double @var{y}) |
| @deftypefunx float fmaxf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} fmaxl (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN fmaxfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx fmaxfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{fmaxfN, TS 18661-3:2015, math.h} |
| @standardsx{fmaxfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double fminmag (double @var{x}, double @var{y}) |
| @deftypefunx float fminmagf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} fminmagl (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN fminmagfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx fminmagfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{fminmagfN, TS 18661-3:2015, math.h} |
| @standardsx{fminmagfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions, from TS 18661-1:2014 and TS 18661-3:2015, return |
| whichever of the two values @var{x} and @var{y} has the smaller absolute |
| value. If both have the same absolute value, or either is NaN, they |
| behave the same as the @code{fmin} functions. |
| @end deftypefun |
| |
| @deftypefun double fmaxmag (double @var{x}, double @var{y}) |
| @deftypefunx float fmaxmagf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} fmaxmagl (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN fmaxmagfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx fmaxmagfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{fmaxmagfN, TS 18661-3:2015, math.h} |
| @standardsx{fmaxmagfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions, from TS 18661-1:2014, return whichever of the two |
| values @var{x} and @var{y} has the greater absolute value. If both |
| have the same absolute value, or either is NaN, they behave the same |
| as the @code{fmax} functions. |
| @end deftypefun |
| |
| @deftypefun double fdim (double @var{x}, double @var{y}) |
| @deftypefunx float fdimf (float @var{x}, float @var{y}) |
| @deftypefunx {long double} fdiml (long double @var{x}, long double @var{y}) |
| @deftypefunx _FloatN fdimfN (_Float@var{N} @var{x}, _Float@var{N} @var{y}) |
| @deftypefunx _FloatNx fdimfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}) |
| @standards{ISO, math.h} |
| @standardsx{fdimfN, TS 18661-3:2015, math.h} |
| @standardsx{fdimfNx, TS 18661-3:2015, math.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double fma (double @var{x}, double @var{y}, double @var{z}) |
| @deftypefunx float fmaf (float @var{x}, float @var{y}, float @var{z}) |
| @deftypefunx {long double} fmal (long double @var{x}, long double @var{y}, long double @var{z}) |
| @deftypefunx _FloatN fmafN (_Float@var{N} @var{x}, _Float@var{N} @var{y}, _Float@var{N} @var{z}) |
| @deftypefunx _FloatNx fmafNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y}, _Float@var{N}x @var{z}) |
| @standards{ISO, math.h} |
| @standardsx{fmafN, TS 18661-3:2015, math.h} |
| @standardsx{fmafNx, TS 18661-3:2015, math.h} |
| @cindex butterfly |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 @theglibc{}, 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}. |
| |
| Likewise, on machines that have support for @code{_Float@var{N}} or |
| @code{_Float@var{N}x} enabled, the complex types @code{_Float@var{N} |
| complex} and @code{_Float@var{N}x complex} are also available if |
| @file{complex.h} has been included; @pxref{Mathematics}. |
| |
| 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 |
| @standards{C99, complex.h} |
| 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 |
| @standards{C99, complex.h} |
| 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. |
| |
| @deftypefun double creal (complex double @var{z}) |
| @deftypefunx float crealf (complex float @var{z}) |
| @deftypefunx {long double} creall (complex long double @var{z}) |
| @deftypefunx _FloatN crealfN (complex _Float@var{N} @var{z}) |
| @deftypefunx _FloatNx crealfNx (complex _Float@var{N}x @var{z}) |
| @standards{ISO, complex.h} |
| @standardsx{crealfN, TS 18661-3:2015, complex.h} |
| @standardsx{crealfNx, TS 18661-3:2015, complex.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions return the real part of the complex number @var{z}. |
| @end deftypefun |
| |
| @deftypefun double cimag (complex double @var{z}) |
| @deftypefunx float cimagf (complex float @var{z}) |
| @deftypefunx {long double} cimagl (complex long double @var{z}) |
| @deftypefunx _FloatN cimagfN (complex _Float@var{N} @var{z}) |
| @deftypefunx _FloatNx cimagfNx (complex _Float@var{N}x @var{z}) |
| @standards{ISO, complex.h} |
| @standardsx{cimagfN, TS 18661-3:2015, complex.h} |
| @standardsx{cimagfNx, TS 18661-3:2015, complex.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions return the imaginary part of the complex number @var{z}. |
| @end deftypefun |
| |
| @deftypefun {complex double} conj (complex double @var{z}) |
| @deftypefunx {complex float} conjf (complex float @var{z}) |
| @deftypefunx {complex long double} conjl (complex long double @var{z}) |
| @deftypefunx {complex _FloatN} conjfN (complex _Float@var{N} @var{z}) |
| @deftypefunx {complex _FloatNx} conjfNx (complex _Float@var{N}x @var{z}) |
| @standards{ISO, complex.h} |
| @standardsx{conjfN, TS 18661-3:2015, complex.h} |
| @standardsx{conjfNx, TS 18661-3:2015, complex.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun double carg (complex double @var{z}) |
| @deftypefunx float cargf (complex float @var{z}) |
| @deftypefunx {long double} cargl (complex long double @var{z}) |
| @deftypefunx _FloatN cargfN (complex _Float@var{N} @var{z}) |
| @deftypefunx _FloatNx cargfNx (complex _Float@var{N}x @var{z}) |
| @standards{ISO, complex.h} |
| @standardsx{cargfN, TS 18661-3:2015, complex.h} |
| @standardsx{cargfNx, TS 18661-3:2015, complex.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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{-@pi{}} to @math{@pi{}}. |
| |
| @code{carg} has a branch cut along the negative real axis. |
| @end deftypefun |
| |
| @deftypefun {complex double} cproj (complex double @var{z}) |
| @deftypefunx {complex float} cprojf (complex float @var{z}) |
| @deftypefunx {complex long double} cprojl (complex long double @var{z}) |
| @deftypefunx {complex _FloatN} cprojfN (complex _Float@var{N} @var{z}) |
| @deftypefunx {complex _FloatNx} cprojfNx (complex _Float@var{N}x @var{z}) |
| @standards{ISO, complex.h} |
| @standardsx{cprojfN, TS 18661-3:2015, complex.h} |
| @standardsx{cprojfNx, TS 18661-3:2015, complex.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| These functions return the projection of the complex value @var{z} onto |
| the Riemann sphere. Values with an 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. |
| |
| @deftypefun {long int} strtol (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @c strtol uses the thread-local pointer to the locale in effect, and |
| @c strtol_l loads the LC_NUMERIC locale data from it early on and once, |
| @c but if the locale is the global locale, and another thread calls |
| @c setlocale in a way that modifies the pointer to the LC_CTYPE locale |
| @c category, the behavior of e.g. IS*, TOUPPER will vary throughout the |
| @c execution of the function, because they re-read the locale data from |
| @c the given locale pointer. We solved this by documenting setlocale as |
| @c MT-Unsafe. |
| 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 |
| |
| @deftypefun {long int} wcstol (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {unsigned long int} strtoul (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {unsigned long int} wcstoul (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {long long int} strtoll (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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{LLONG_MAX} or @code{LLONG_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 |
| |
| @deftypefun {long long int} wcstoll (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {long long int} strtoq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{BSD, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @code{strtoq} (``string-to-quad-word'') is the BSD name for @code{strtoll}. |
| @end deftypefun |
| |
| @deftypefun {long long int} wcstoq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{GNU, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {unsigned long long int} strtoull (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {unsigned long long int} wcstoull (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {unsigned long long int} strtouq (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{BSD, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @code{strtouq} is the BSD name for @code{strtoull}. |
| @end deftypefun |
| |
| @deftypefun {unsigned long long int} wcstouq (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{GNU, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun intmax_t strtoimax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, inttypes.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun intmax_t wcstoimax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun uintmax_t strtoumax (const char *restrict @var{string}, char **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, inttypes.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun uintmax_t wcstoumax (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}, int @var{base}) |
| @standards{ISO, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {long int} atol (const char *@var{string}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int atoi (const char *@var{string}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {long long int} atoll (const char *@var{string}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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. |
| |
| @deftypefun double strtod (const char *restrict @var{string}, char **restrict @var{tailptr}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @c Besides the unsafe-but-ruled-safe locale uses, this uses a lot of |
| @c mpn, but it's all safe. |
| @c |
| @c round_and_return |
| @c get_rounding_mode ok |
| @c mpn_add_1 ok |
| @c mpn_rshift ok |
| @c MPN_ZERO ok |
| @c MPN2FLOAT -> mpn_construct_(float|double|long_double) ok |
| @c str_to_mpn |
| @c mpn_mul_1 -> umul_ppmm ok |
| @c mpn_add_1 ok |
| @c mpn_lshift_1 -> mpn_lshift ok |
| @c STRTOF_INTERNAL |
| @c MPN_VAR ok |
| @c SET_MANTISSA ok |
| @c STRNCASECMP ok, wide and narrow |
| @c round_and_return ok |
| @c mpn_mul ok |
| @c mpn_addmul_1 ok |
| @c ... mpn_sub |
| @c mpn_lshift ok |
| @c udiv_qrnnd ok |
| @c count_leading_zeros ok |
| @c add_ssaaaa ok |
| @c sub_ddmmss ok |
| @c umul_ppmm ok |
| @c mpn_submul_1 ok |
| 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 |
| |
| @deftypefun float strtof (const char *@var{string}, char **@var{tailptr}) |
| @deftypefunx {long double} strtold (const char *@var{string}, char **@var{tailptr}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @comment See safety comments for strtod. |
| 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 |
| |
| @deftypefun _FloatN strtofN (const char *@var{string}, char **@var{tailptr}) |
| @deftypefunx _FloatNx strtofNx (const char *@var{string}, char **@var{tailptr}) |
| @standards{ISO/IEC TS 18661-3, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @comment See safety comments for strtod. |
| These functions are like @code{strtod}, except for the return type. |
| |
| They were introduced in @w{ISO/IEC TS 18661-3} and are available on machines |
| that support the related types; @pxref{Mathematics}. |
| @end deftypefun |
| |
| @deftypefun double wcstod (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr}) |
| @deftypefunx float wcstof (const wchar_t *@var{string}, wchar_t **@var{tailptr}) |
| @deftypefunx {long double} wcstold (const wchar_t *@var{string}, wchar_t **@var{tailptr}) |
| @deftypefunx _FloatN wcstofN (const wchar_t *@var{string}, wchar_t **@var{tailptr}) |
| @deftypefunx _FloatNx wcstofNx (const wchar_t *@var{string}, wchar_t **@var{tailptr}) |
| @standards{ISO, wchar.h} |
| @standardsx{wcstofN, GNU, wchar.h} |
| @standardsx{wcstofNx, GNU, wchar.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| @comment See safety comments for strtod. |
| The @code{wcstod}, @code{wcstof}, @code{wcstol}, @code{wcstof@var{N}}, |
| and @code{wcstof@var{N}x} functions are equivalent in nearly all aspects |
| to the @code{strtod}, @code{strtof}, @code{strtold}, |
| @code{strtof@var{N}}, and @code{strtof@var{N}x} functions, but they |
| handle wide character strings. |
| |
| 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}. |
| |
| The @code{wcstof@var{N}} and @code{wcstof@var{N}x} functions are not in |
| any standard, but are added to provide completeness for the |
| non-deprecated interface of wide character string to floating-point |
| conversion functions. They are only available on machines that support |
| the related types; @pxref{Mathematics}. |
| @end deftypefun |
| |
| @deftypefun double atof (const char *@var{string}) |
| @standards{ISO, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} |
| 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 |
| |
| @Theglibc{} also provides @samp{_l} versions of these functions, |
| which take an additional argument, the locale to use in conversion. |
| |
| See also @ref{Parsing of Integers}. |
| |
| @node Printing of Floats |
| @section Printing of Floats |
| |
| @pindex stdlib.h |
| The @samp{strfrom} functions are declared in @file{stdlib.h}. |
| |
| @deftypefun int strfromd (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, double @var{value}) |
| @deftypefunx int strfromf (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, float @var{value}) |
| @deftypefunx int strfroml (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, long double @var{value}) |
| @standards{ISO/IEC TS 18661-1, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} |
| @comment All these functions depend on both __printf_fp and __printf_fphex, |
| @comment which are both AS-unsafe (ascuheap) and AC-unsafe (acsmem). |
| The functions @code{strfromd} (``string-from-double''), @code{strfromf} |
| (``string-from-float''), and @code{strfroml} (``string-from-long-double'') |
| convert the floating-point number @var{value} to a string of characters and |
| stores them into the area pointed to by @var{string}. The conversion |
| writes at most @var{size} characters and respects the format specified by |
| @var{format}. |
| |
| The format string must start with the character @samp{%}. An optional |
| precision follows, which starts with a period, @samp{.}, and may be |
| followed by a decimal integer, representing the precision. If a decimal |
| integer is not specified after the period, the precision is taken to be |
| zero. The character @samp{*} is not allowed. Finally, the format string |
| ends with one of the following conversion specifiers: @samp{a}, @samp{A}, |
| @samp{e}, @samp{E}, @samp{f}, @samp{F}, @samp{g} or @samp{G} (@pxref{Table |
| of Output Conversions}). Invalid format strings result in undefined |
| behavior. |
| |
| These functions return the number of characters that would have been |
| written to @var{string} had @var{size} been sufficiently large, not |
| counting the terminating null character. Thus, the null-terminated output |
| has been completely written if and only if the returned value is less than |
| @var{size}. |
| |
| These functions were introduced by ISO/IEC TS 18661-1. |
| @end deftypefun |
| |
| @deftypefun int strfromfN (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, _Float@var{N} @var{value}) |
| @deftypefunx int strfromfNx (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, _Float@var{N}x @var{value}) |
| @standards{ISO/IEC TS 18661-3, stdlib.h} |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} |
| @comment See safety comments for strfromd. |
| These functions are like @code{strfromd}, except for the type of |
| @code{value}. |
| |
| They were introduced in @w{ISO/IEC TS 18661-3} and are available on machines |
| that support the related types; @pxref{Mathematics}. |
| @end deftypefun |
| |
| @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. @Theglibc{} |
| also provides these functions and some natural extensions. |
| |
| These functions are only available in @theglibc{} 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}. |
| |
| @deftypefun {char *} ecvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) |
| @standards{SVID, stdlib.h} |
| @standards{Unix98, stdlib.h} |
| @safety{@prelim{}@mtunsafe{@mtasurace{:ecvt}}@asunsafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {char *} fcvt (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) |
| @standards{SVID, stdlib.h} |
| @standards{Unix98, stdlib.h} |
| @safety{@prelim{}@mtunsafe{@mtasurace{:fcvt}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} |
| 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 |
| |
| @deftypefun {char *} gcvt (double @var{value}, int @var{ndigit}, char *@var{buf}) |
| @standards{SVID, stdlib.h} |
| @standards{Unix98, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c gcvt calls sprintf, that ultimately calls vfprintf, which malloc()s |
| @c args_value if it's too large, but gcvt never exercises this path. |
| @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, @theglibc{} provides versions of these three |
| functions that take @code{long double} arguments. |
| |
| @deftypefun {char *} qecvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) |
| @standards{GNU, stdlib.h} |
| @safety{@prelim{}@mtunsafe{@mtasurace{:qecvt}}@asunsafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun {char *} qfcvt (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}) |
| @standards{GNU, stdlib.h} |
| @safety{@prelim{}@mtunsafe{@mtasurace{:qfcvt}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} |
| 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 |
| |
| @deftypefun {char *} qgcvt (long double @var{value}, int @var{ndigit}, char *@var{buf}) |
| @standards{GNU, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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. @Theglibc{} |
| 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. |
| |
| @deftypefun int ecvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) |
| @standards{GNU, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int fcvt_r (double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) |
| @standards{SVID, stdlib.h} |
| @standards{Unix98, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int qecvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) |
| @standards{GNU, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |
| |
| @deftypefun int qfcvt_r (long double @var{value}, int @var{ndigit}, int *@var{decpt}, int *@var{neg}, char *@var{buf}, size_t @var{len}) |
| @standards{GNU, stdlib.h} |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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 |