12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170 |
- @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 @code{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 @code{errno} to @code{ERANGE} if returning @math{@infinity{}} or
- @math{-@infinity{}}; @code{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. @code{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
- @deftypefun float fadd (double @var{x}, double @var{y})
- @deftypefunx float faddl (long double @var{x}, long double @var{y})
- @deftypefunx double daddl (long double @var{x}, long double @var{y})
- @deftypefunx _FloatM fMaddfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatM fMaddfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @deftypefunx _FloatMx fMxaddfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatMx fMxaddfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @standards{TS 18661-1:2014, math.h}
- @standardsx{fMaddfN, TS 18661-3:2015, math.h}
- @standardsx{fMaddfNx, TS 18661-3:2015, math.h}
- @standardsx{fMxaddfN, TS 18661-3:2015, math.h}
- @standardsx{fMxaddfNx, TS 18661-3:2015, math.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- These functions, from TS 18661-1:2014 and TS 18661-3:2015, return
- @math{@var{x} + @var{y}}, rounded once to the return type of the
- function without any intermediate rounding to the type of the
- arguments.
- @end deftypefun
- @deftypefun float fsub (double @var{x}, double @var{y})
- @deftypefunx float fsubl (long double @var{x}, long double @var{y})
- @deftypefunx double dsubl (long double @var{x}, long double @var{y})
- @deftypefunx _FloatM fMsubfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatM fMsubfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @deftypefunx _FloatMx fMxsubfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatMx fMxsubfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @standards{TS 18661-1:2014, math.h}
- @standardsx{fMsubfN, TS 18661-3:2015, math.h}
- @standardsx{fMsubfNx, TS 18661-3:2015, math.h}
- @standardsx{fMxsubfN, TS 18661-3:2015, math.h}
- @standardsx{fMxsubfNx, TS 18661-3:2015, math.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- These functions, from TS 18661-1:2014 and TS 18661-3:2015, return
- @math{@var{x} - @var{y}}, rounded once to the return type of the
- function without any intermediate rounding to the type of the
- arguments.
- @end deftypefun
- @deftypefun float fmul (double @var{x}, double @var{y})
- @deftypefunx float fmull (long double @var{x}, long double @var{y})
- @deftypefunx double dmull (long double @var{x}, long double @var{y})
- @deftypefunx _FloatM fMmulfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatM fMmulfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @deftypefunx _FloatMx fMxmulfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatMx fMxmulfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @standards{TS 18661-1:2014, math.h}
- @standardsx{fMmulfN, TS 18661-3:2015, math.h}
- @standardsx{fMmulfNx, TS 18661-3:2015, math.h}
- @standardsx{fMxmulfN, TS 18661-3:2015, math.h}
- @standardsx{fMxmulfNx, TS 18661-3:2015, math.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- These functions, from TS 18661-1:2014 and TS 18661-3:2015, return
- @math{@var{x} * @var{y}}, rounded once to the return type of the
- function without any intermediate rounding to the type of the
- arguments.
- @end deftypefun
- @deftypefun float fdiv (double @var{x}, double @var{y})
- @deftypefunx float fdivl (long double @var{x}, long double @var{y})
- @deftypefunx double ddivl (long double @var{x}, long double @var{y})
- @deftypefunx _FloatM fMdivfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatM fMdivfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @deftypefunx _FloatMx fMxdivfN (_Float@var{N} @var{x}, _Float@var{N} @var{y})
- @deftypefunx _FloatMx fMxdivfNx (_Float@var{N}x @var{x}, _Float@var{N}x @var{y})
- @standards{TS 18661-1:2014, math.h}
- @standardsx{fMdivfN, TS 18661-3:2015, math.h}
- @standardsx{fMdivfNx, TS 18661-3:2015, math.h}
- @standardsx{fMxdivfN, TS 18661-3:2015, math.h}
- @standardsx{fMxdivfNx, TS 18661-3:2015, math.h}
- @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
- These functions, from TS 18661-1:2014 and TS 18661-3:2015, return
- @math{@var{x} / @var{y}}, rounded once to the return type of the
- function without any intermediate rounding to the type of the
- arguments.
- @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 @code{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 @code{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_NAN_PAYLOAD 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 @code{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
|