📄 arith.texi
字号:
@node Arithmetic, Date and Time, Mathematics, Top@chapter Low-Level Arithmetic FunctionsThis chapter contains information about functions for doing basicarithmetic operations, such as splitting a float into its integer andfractional parts. These functions are declared in the header file@file{math.h}.@menu* Not a Number:: Making NaNs and testing for NaNs.* Predicates on Floats:: Testing for infinity and for NaNs.* Absolute Value:: Absolute value functions.* Normalization Functions:: Hacks for radix-2 representations.* Rounding and Remainders:: Determinining the integer and fractional parts of a float.* Integer Division:: Functions for performing integer division.* Parsing of Numbers:: Functions for ``reading'' numbers from strings.@end menu@node Not a Number@section ``Not a Number'' Values@cindex NaN@cindex not a number@cindex IEEE floating pointThe IEEE floating point format used by most modern computers supportsvalues that are ``not a number''. These values are called @dfn{NaNs}.``Not a number'' values result from certain operations which have nomeaningful numeric result, such as zero divided by zero or infinitydivided by infinity.One noteworthy property of NaNs is that they are not equal tothemselves. Thus, @code{x == x} can be 0 if the value of @code{x} is aNaN. You can use this to test whether a value is a NaN or not: if it isnot equal to itself, then it is a NaN. But the recommended way to testfor a NaN is with the @code{isnan} function (@pxref{Predicates on Floats}).Almost any arithmetic operation in which one argument is a NaN returnsa NaN.@comment math.h@comment GNU@deftypevr Macro double NANAn expression representing a value which is ``not a number''. Thismacro is a GNU extension, available only on machines that support ``nota number'' values---that is to say, on all machines that support IEEEfloating point.You can use @samp{#ifdef NAN} to test whether the machine supportsNaNs. (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@node Predicates on Floats@section Predicates on Floats@pindex math.hThis section describes some miscellaneous test functions on doubles.Prototypes for these functions appear in @file{math.h}. These are BSDfunctions, and thus are available if you define @code{_BSD_SOURCE} or@code{_GNU_SOURCE}.@comment math.h@comment BSD@deftypefun int isinf (double @var{x})This function returns @code{-1} if @var{x} represents negative infinity,@code{1} if @var{x} represents positive infinity, and @code{0} otherwise.@end deftypefun@comment math.h@comment BSD@deftypefun int isnan (double @var{x})This function returns a nonzero value if @var{x} is a ``not a number''value, and zero otherwise. (You can just as well use @code{@var{x} !=@var{x}} to get the same result).@end deftypefun@comment math.h@comment BSD@deftypefun int finite (double @var{x})This function returns a nonzero value if @var{x} is finite or a ``not anumber'' value, and zero otherwise.@end deftypefun@comment math.h@comment BSD@deftypefun double infnan (int @var{error})This function is provided for compatibility with BSD. The othermathematical functions use @code{infnan} to decide what to return onoccasion of an error. Its argument is an error code, @code{EDOM} or@code{ERANGE}; @code{infnan} returns a suitable value to indicate thiswith. @code{-ERANGE} is also acceptable as an argument, and correspondsto @code{-HUGE_VAL} as a value.In the BSD library, on certain machines, @code{infnan} raises a fatalsignal in all cases. The GNU library does not do likewise, because thatdoes not fit the ANSI C specification.@end deftypefun@strong{Portability Note:} The functions listed in this section are BSDextensions.@node Absolute Value@section Absolute Value@cindex absolute value functionsThese 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} is @var{x} is positive, @minus{}@var{x} if @var{x} isnegative. For a complex number @var{z}, whose real part is @var{x} andwhose 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.hPrototypes for @code{abs} and @code{labs} are in @file{stdlib.h};@code{fabs} and @code{cabs} are declared in @file{math.h}.@comment stdlib.h@comment ANSI@deftypefun int abs (int @var{number})This function returns the absolute value of @var{number}.Most computers use a two's complement integer representation, in whichthe absolute value of @code{INT_MIN} (the smallest possible @code{int})cannot be represented; thus, @w{@code{abs (INT_MIN)}} is not defined.@end deftypefun@comment stdlib.h@comment ANSI@deftypefun {long int} labs (long int @var{number})This is similar to @code{abs}, except that both the argument and resultare of type @code{long int} rather than @code{int}.@end deftypefun@comment math.h@comment ANSI@deftypefun double fabs (double @var{number})This function returns the absolute value of the floating-point number@var{number}.@end deftypefun@comment math.h@comment BSD@deftypefun double cabs (struct @{ double real, imag; @} @var{z})The @code{cabs} function returns the absolute value of the complexnumber @var{z}, whose real part is @code{@var{z}.real} and whoseimaginary part is @code{@var{z}.imag}. (See also the function@code{hypot} in @ref{Exponents and Logarithms}.) The value is:@smallexamplesqrt (@var{z}.real*@var{z}.real + @var{z}.imag*@var{z}.imag)@end smallexample@end deftypefun@node Normalization Functions@section Normalization Functions@cindex normalization functions (floating-point)The functions described in this section are primarily provided as a wayto efficiently perform certain low-level manipulations on floating pointnumbers that are represented internally using a binary radix;see @ref{Floating Point Concepts}. These functions are required tohave equivalent behavior even if the representation does not use a radixof 2, but of course they are unlikely to be particularly efficient inthose cases.@pindex math.hAll these functions are declared in @file{math.h}.@comment math.h@comment ANSI@deftypefun double frexp (double @var{value}, int *@var{exponent})The @code{frexp} function is used to split the number @var{value}into a normalized fraction and an exponent.If the argument @var{value} is not zero, the return value is @var{value}times a power of two, and is always in the range 1/2 (inclusive) to 1(exclusive). The corresponding exponent is stored in@code{*@var{exponent}}; the return value multiplied by 2 raised to thisexponent equals the original number @var{value}.For example, @code{frexp (12.8, &exponent)} returns @code{0.8} andstores @code{4} in @code{exponent}.If @var{value} is zero, then the return value is zero andzero is stored in @code{*@var{exponent}}.@end deftypefun@comment math.h@comment ANSI@deftypefun double ldexp (double @var{value}, int @var{exponent})This function returns the result of multiplying the floating-pointnumber @var{value} by 2 raised to the power @var{exponent}. (It canbe used to reassemble floating-point numbers that were taken apartby @code{frexp}.)For example, @code{ldexp (0.8, 4)} returns @code{12.8}.@end deftypefunThe following functions which come from BSD provide facilitiesequivalent to those of @code{ldexp} and @code{frexp}:@comment math.h@comment BSD@deftypefun double scalb (double @var{value}, int @var{exponent})The @code{scalb} function is the BSD name for @code{ldexp}.@end deftypefun@comment math.h@comment BSD@deftypefun double logb (double @var{x})This BSD function returns the integer part of the base-2 logarithm of@var{x}, an integer value represented in type @code{double}. This isthe highest integer power of @code{2} contained in @var{x}. The sign of@var{x} is ignored. For example, @code{logb (3.5)} is @code{1.0} and@code{logb (4.0)} is @code{2.0}.When @code{2} raised to this power is divided into @var{x}, it gives aquotient between @code{1} (inclusive) and @code{2} (exclusive).If @var{x} is zero, the value is minus infinity (if the machine supportssuch a value), or else a very small number. If @var{x} is infinity, thevalue is infinity.The value returned by @code{logb} is one less than the value that@code{frexp} would store into @code{*@var{exponent}}.@end deftypefun@comment math.h@comment BSD@deftypefun double copysign (double @var{value}, double @var{sign})The @code{copysign} function returns a value whose absolute value is thesame as that of @var{value}, and whose sign matches that of @var{sign}.This is a BSD function.@end deftypefun@node Rounding and Remainders@section Rounding and Remainder Functions@cindex rounding functions@cindex remainder functions@cindex converting floats to integers@pindex math.hThe functions listed here perform operations such as rounding,truncation, and remainder in division of floating point numbers. Someof 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 bycasting them to @code{int}. This discards the fractional part,effectively rounding towards zero. However, this only works if theresult can actually be represented as an @code{int}---for very largenumbers, this is impossible. The functions listed here return theresult as a @code{double} instead to get around this problem.@comment math.h@comment ANSI@deftypefun double ceil (double @var{x})The @code{ceil} function rounds @var{x} upwards to the nearest integer,returning that value as a @code{double}. Thus, @code{ceil (1.5)}is @code{2.0}.@end deftypefun@comment math.h@comment ANSI@deftypefun double floor (double @var{x})The @code{ceil} function rounds @var{x} downwards to the nearestinteger, returning that value as a @code{double}. Thus, @code{floor(1.5)} is @code{1.0} and @code{floor (-1.5)} is @code{-2.0}.@end deftypefun@comment math.h@comment BSD@deftypefun double rint (double @var{x})This function rounds @var{x} to an integer value according to thecurrent rounding mode. @xref{Floating Point Parameters}, forinformation about the various rounding modes. The defaultrounding mode is to round to the nearest integer; some machinessupport other modes, but round-to-nearest is always used unlessyou explicit select another.@end deftypefun@comment math.h@comment ANSI@deftypefun double modf (double @var{value}, double *@var{integer-part})This function breaks the argument @var{value} into an integer part and afractional part (between @code{-1} and @code{1}, exclusive). Their sumequals @var{value}. Each of the parts has the same sign as @var{value},so the rounding of the integer part is towards zero.@code{modf} stores the integer part in @code{*@var{integer-part}}, andreturns the fractional part. For example, @code{modf (2.5, &intpart)}returns @code{0.5} and stores @code{2.0} into @code{intpart}.@end deftypefun@comment math.h@comment ANSI@deftypefun double fmod (double @var{numerator}, double @var{denominator})This function computes the remainder from the division of@var{numerator} by @var{denominator}. Specifically, the return value is@w{@code{@var{numerator} - @var{n} * @var{denominator}}}, where @var{n}is the quotient of @var{numerator} divided by @var{denominator}, roundedtowards 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 magnitudeless than the magnitude of the @var{denominator}.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -