xref: /freebsd/lib/msun/man/math.3 (revision dbc8f2b5ce76021eb9e9802f3772dcb84a7771f3)
13a8617a8SJordan K. Hubbard.\" Copyright (c) 1985 Regents of the University of California.
23a8617a8SJordan K. Hubbard.\" All rights reserved.
33a8617a8SJordan K. Hubbard.\"
43a8617a8SJordan K. Hubbard.\" Redistribution and use in source and binary forms, with or without
53a8617a8SJordan K. Hubbard.\" modification, are permitted provided that the following conditions
63a8617a8SJordan K. Hubbard.\" are met:
73a8617a8SJordan K. Hubbard.\" 1. Redistributions of source code must retain the above copyright
83a8617a8SJordan K. Hubbard.\"    notice, this list of conditions and the following disclaimer.
93a8617a8SJordan K. Hubbard.\" 2. Redistributions in binary form must reproduce the above copyright
103a8617a8SJordan K. Hubbard.\"    notice, this list of conditions and the following disclaimer in the
113a8617a8SJordan K. Hubbard.\"    documentation and/or other materials provided with the distribution.
123a8617a8SJordan K. Hubbard.\" 3. All advertising materials mentioning features or use of this software
133a8617a8SJordan K. Hubbard.\"    must display the following acknowledgement:
143a8617a8SJordan K. Hubbard.\"	This product includes software developed by the University of
153a8617a8SJordan K. Hubbard.\"	California, Berkeley and its contributors.
163a8617a8SJordan K. Hubbard.\" 4. Neither the name of the University nor the names of its contributors
173a8617a8SJordan K. Hubbard.\"    may be used to endorse or promote products derived from this software
183a8617a8SJordan K. Hubbard.\"    without specific prior written permission.
193a8617a8SJordan K. Hubbard.\"
203a8617a8SJordan K. Hubbard.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
213a8617a8SJordan K. Hubbard.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
223a8617a8SJordan K. Hubbard.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
233a8617a8SJordan K. Hubbard.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
243a8617a8SJordan K. Hubbard.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
253a8617a8SJordan K. Hubbard.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
263a8617a8SJordan K. Hubbard.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
273a8617a8SJordan K. Hubbard.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
283a8617a8SJordan K. Hubbard.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
293a8617a8SJordan K. Hubbard.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
303a8617a8SJordan K. Hubbard.\" SUCH DAMAGE.
313a8617a8SJordan K. Hubbard.\"
323a8617a8SJordan K. Hubbard.\"	from: @(#)math.3	6.10 (Berkeley) 5/6/91
337f3dea24SPeter Wemm.\" $FreeBSD$
343a8617a8SJordan K. Hubbard.\"
352a6bf1faSDavid Schultz.Dd June 11, 2004
362a6bf1faSDavid Schultz.Dt MATH 3
372a6bf1faSDavid Schultz.Os
383a8617a8SJordan K. Hubbard.ds up \fIulp\fR
393a8617a8SJordan K. Hubbard.de If
403a8617a8SJordan K. Hubbard.if n \\
413a8617a8SJordan K. Hubbard\\$1Infinity\\$2
423a8617a8SJordan K. Hubbard.if t \\
433a8617a8SJordan K. Hubbard\\$1\\(if\\$2
443a8617a8SJordan K. Hubbard..
452a6bf1faSDavid Schultz.Sh NAME
46dbc8f2b5SDavid Schultzmath \- floating-point mathematical library
47dbc8f2b5SDavid Schultz.Sh LIBRARY
48dbc8f2b5SDavid Schultz.Lb libm
49dbc8f2b5SDavid Schultz.Sh SYNOPSIS
50dbc8f2b5SDavid Schultz.In math.h
512a6bf1faSDavid Schultz.Sh DESCRIPTION
52dbc8f2b5SDavid SchultzThese functions constitute the C math library.
532a6bf1faSDavid Schultz.Sh "LIST OF FUNCTIONS"
542a6bf1faSDavid SchultzEach of the following
552a6bf1faSDavid Schultz.Vt double
562a6bf1faSDavid Schultzfunctions has a
572a6bf1faSDavid Schultz.Vt float
582a6bf1faSDavid Schultzcounterpart with an
592a6bf1faSDavid Schultz.Ql f
602a6bf1faSDavid Schultzappended to the name and a
612a6bf1faSDavid Schultz.Vt long double
622a6bf1faSDavid Schultzcounterpart with an
632a6bf1faSDavid Schultz.Ql l
642a6bf1faSDavid Schultzappended.
652a6bf1faSDavid SchultzAs an example, the
662a6bf1faSDavid Schultz.Vt float
672a6bf1faSDavid Schultzand
682a6bf1faSDavid Schultz.Vt long double
692a6bf1faSDavid Schultzcounterparts of
702a6bf1faSDavid Schultz.Ft double
712a6bf1faSDavid Schultz.Fn acos "double x"
722a6bf1faSDavid Schultzare
732a6bf1faSDavid Schultz.Ft float
742a6bf1faSDavid Schultz.Fn acosf "float x"
752a6bf1faSDavid Schultzand
762a6bf1faSDavid Schultz.Ft long double
772a6bf1faSDavid Schultz.Fn acosl "long double x" ,
782a6bf1faSDavid Schultzrespectively.
79dbc8f2b5SDavid Schultz.Pp
80dbc8f2b5SDavid SchultzThe programs are accurate to within the numbers
81dbc8f2b5SDavid Schultzof \*(ups tabulated below; an \*(up is one \fIU\fRnit in the \fIL\fRast
82dbc8f2b5SDavid Schultz\fIP\fRlace.
833a8617a8SJordan K. Hubbard.sp 2
843a8617a8SJordan K. Hubbard.nf
852a6bf1faSDavid Schultz.ta \w'nexttoward'u+10n +\w'remainder with partial quot'u
862a6bf1faSDavid Schultz\fIName\fP	\fIDescription\fP	\fIError Bound (ULPs)\fP
872a6bf1faSDavid Schultz.ta \w'nexttoward'u+4n +\w'remainder with partial quotient'u+6nC
883a8617a8SJordan K. Hubbard.sp 5p
892a6bf1faSDavid Schultz.\" XXX Many of these error bounds are wrong for the current implementation!
90dbc8f2b5SDavid Schultzacos	inverse trigonometric function	???
91dbc8f2b5SDavid Schultzacosh	inverse hyperbolic function	???
92dbc8f2b5SDavid Schultzasin	inverse trigonometric function	???
93dbc8f2b5SDavid Schultzasinh	inverse hyperbolic function	???
94dbc8f2b5SDavid Schultzatan	inverse trigonometric function	???
95dbc8f2b5SDavid Schultzatanh	inverse hyperbolic function	???
96dbc8f2b5SDavid Schultzatan2	inverse trigonometric function	???
972a6bf1faSDavid Schultzcbrt	cube root	1
982a6bf1faSDavid Schultzceil	integer no less than	0
992a6bf1faSDavid Schultzcopysign	copy sign bit	0
1002a6bf1faSDavid Schultzcos	trigonometric function	1
101dbc8f2b5SDavid Schultzcosh	hyperbolic function	???
102dbc8f2b5SDavid Schultzerf	error function	1
103dbc8f2b5SDavid Schultzerfc	complementary error function	1
1042a6bf1faSDavid Schultzexp	exponential base e	1
1052a6bf1faSDavid Schultz.\" exp2	exponential base 2	???
1062a6bf1faSDavid Schultzexpm1	exp(x)\-1	1
1072a6bf1faSDavid Schultzfabs	absolute value	0
108dbc8f2b5SDavid Schultzfdim	positive difference	1
1092a6bf1faSDavid Schultzfloor	integer no greater than	0
1102a6bf1faSDavid Schultz.\" fma	multiply-add	???
111dbc8f2b5SDavid Schultzfmax	maximum function	0
112dbc8f2b5SDavid Schultzfmin	minimum function	0
1132a6bf1faSDavid Schultzfmod	remainder function	???
1142a6bf1faSDavid Schultzfrexp	extract mantissa and exponent	0
1152a6bf1faSDavid Schultzhypot	Euclidean distance	1
1162a6bf1faSDavid Schultzilogb	exponent extraction	0
1172a6bf1faSDavid Schultzj0	bessel function	???
1182a6bf1faSDavid Schultzj1	bessel function	???
1192a6bf1faSDavid Schultzjn	bessel function	???
1202a6bf1faSDavid Schultzldexp	multiply by power of 2	0
121dbc8f2b5SDavid Schultzlgamma	log gamma function	1
1222a6bf1faSDavid Schultz.\" llrint	round to integer	0
1232a6bf1faSDavid Schultz.\" llround	round to nearest integer	0
1242a6bf1faSDavid Schultzlog	natural logarithm	1
125dbc8f2b5SDavid Schultzlog10	logarithm to base 10	1
1262a6bf1faSDavid Schultzlog1p	log(1+x)	1
1272a6bf1faSDavid Schultz.\" log2	base 2 logarithm	0
1282a6bf1faSDavid Schultzlogb	exponent extraction	0
1292a6bf1faSDavid Schultz.\" lrint	round to integer	0
1302a6bf1faSDavid Schultz.\" lround	round to nearest integer	0
131dbc8f2b5SDavid Schultzmodf	extract fractional part	0
1322a6bf1faSDavid Schultz.\" nan	return quiet \*(Na)	0
133dbc8f2b5SDavid Schultznearbyint	round to integer	0
134f7748f6eSDavid Schultznextafter	next representable value	0
1352a6bf1faSDavid Schultz.\" nexttoward	next representable value	0
1362a6bf1faSDavid Schultzpow	exponential x**y	60\-500
1372a6bf1faSDavid Schultzremainder	remainder	0
1382a6bf1faSDavid Schultz.\" remquo	remainder with partial quotient	???
1392a6bf1faSDavid Schultzrint	round to nearest integer	0
1402a6bf1faSDavid Schultzround	round to nearest integer	0
141f7748f6eSDavid Schultzscalbln	exponent adjustment	0
1422a6bf1faSDavid Schultzscalbn	exponent adjustment	0
1432a6bf1faSDavid Schultzsin	trigonometric function	1
144dbc8f2b5SDavid Schultzsinh	hyperbolic function	???
1452a6bf1faSDavid Schultzsqrt	square root	1
146dbc8f2b5SDavid Schultztan	trigonometric function	1
147dbc8f2b5SDavid Schultztanh	hyperbolic function	???
148dbc8f2b5SDavid Schultztgamma	gamma function	1
149f7748f6eSDavid Schultztrunc	round towards zero	0
1502a6bf1faSDavid Schultzy0	bessel function	???
1512a6bf1faSDavid Schultzy1	bessel function	???
1522a6bf1faSDavid Schultzyn	bessel function	???
1533a8617a8SJordan K. Hubbard.ta
1543a8617a8SJordan K. Hubbard.fi
1552a6bf1faSDavid Schultz.Sh NOTES
1562a6bf1faSDavid SchultzVirtually all modern floating-point units attempt to support
1572a6bf1faSDavid SchultzIEEE Standard 754 for Binary Floating-Point Arithmetic.
1582a6bf1faSDavid SchultzThis standard does not cover particular routines in the math library
1592a6bf1faSDavid Schultzexcept for the few documented in
1602a6bf1faSDavid Schultz.Xr ieee 3 ;
1612a6bf1faSDavid Schultzit primarily defines representations of numbers and abstract
1622a6bf1faSDavid Schultzproperties of arithmetic operations relating to precision, rounding,
1632a6bf1faSDavid Schultzand exceptional cases, as described below.
1642a6bf1faSDavid Schultz.Pp
1653a8617a8SJordan K. Hubbard\fBIEEE STANDARD 754 Floating\-Point Arithmetic:\fR
1662a6bf1faSDavid Schultz.Pp
167dbc8f2b5SDavid Schultz.\" XXX mention single- and extended-/quad- precisions
1683a8617a8SJordan K. HubbardProperties of IEEE 754 Double\-Precision:
1692a6bf1faSDavid Schultz.Bd -filled -offset indent
1703a8617a8SJordan K. HubbardWordsize: 64 bits, 8 bytes.  Radix: Binary.
1713a8617a8SJordan K. Hubbard.br
1723a8617a8SJordan K. HubbardPrecision: 53
1733a8617a8SJordan K. Hubbard.if n \
1743a8617a8SJordan K. Hubbardsig.
1753a8617a8SJordan K. Hubbard.if t \
1763a8617a8SJordan K. Hubbardsignificant
1773a8617a8SJordan K. Hubbardbits, roughly like 16
1783a8617a8SJordan K. Hubbard.if n \
1793a8617a8SJordan K. Hubbardsig.
1803a8617a8SJordan K. Hubbard.if t \
1813a8617a8SJordan K. Hubbardsignificant
1823a8617a8SJordan K. Hubbarddecimals.
1832a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
1843a8617a8SJordan K. HubbardIf x and x' are consecutive positive Double\-Precision
1853a8617a8SJordan K. Hubbardnumbers (they differ by 1 \*(up), then
1863a8617a8SJordan K. Hubbard.br
1873a8617a8SJordan K. Hubbard1.1e\-16 < 0.5**53 < (x'\-x)/x \(<= 0.5**52 < 2.3e\-16.
1882a6bf1faSDavid Schultz.Ed
1893a8617a8SJordan K. Hubbard.nf
1903a8617a8SJordan K. Hubbard.ta \w'Range:'u+1n +\w'Underflow threshold'u+1n +\w'= 2.0**1024'u+1n
1913a8617a8SJordan K. HubbardRange:	Overflow threshold	= 2.0**1024	= 1.8e308
1923a8617a8SJordan K. Hubbard	Underflow threshold	= 0.5**1022	= 2.2e\-308
1933a8617a8SJordan K. Hubbard.ta
1943a8617a8SJordan K. Hubbard.fi
1952a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
1963a8617a8SJordan K. HubbardOverflow goes by default to a signed
1973a8617a8SJordan K. Hubbard.If "" .
1983a8617a8SJordan K. Hubbard.br
1993a8617a8SJordan K. HubbardUnderflow is \fIGradual,\fR rounding to the nearest
2003a8617a8SJordan K. Hubbardinteger multiple of 0.5**1074 = 4.9e\-324.
2012a6bf1faSDavid Schultz.Ed
2023a8617a8SJordan K. HubbardZero is represented ambiguously as +0 or \-0.
2032a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2043a8617a8SJordan K. HubbardIts sign transforms correctly through multiplication or
2053a8617a8SJordan K. Hubbarddivision, and is preserved by addition of zeros
2063a8617a8SJordan K. Hubbardwith like signs; but x\-x yields +0 for every
2073a8617a8SJordan K. Hubbardfinite x.  The only operations that reveal zero's
2083a8617a8SJordan K. Hubbardsign are division by zero and copysign(x,\(+-0).
2093a8617a8SJordan K. HubbardIn particular, comparison (x > y, x \(>= y, etc.)
2103a8617a8SJordan K. Hubbardcannot be affected by the sign of zero; but if
2113a8617a8SJordan K. Hubbardfinite x = y then
2123a8617a8SJordan K. Hubbard.If
2133a8617a8SJordan K. Hubbard\&= 1/(x\-y)
2143a8617a8SJordan K. Hubbard.if n \
2153a8617a8SJordan K. Hubbard!=
2163a8617a8SJordan K. Hubbard.if t \
2173a8617a8SJordan K. Hubbard\(!=
2183a8617a8SJordan K. Hubbard\-1/(y\-x) =
2193a8617a8SJordan K. Hubbard.If \- .
2202a6bf1faSDavid Schultz.Ed
2213a8617a8SJordan K. Hubbard.If
2223a8617a8SJordan K. Hubbardis signed.
2232a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2243a8617a8SJordan K. Hubbardit persists when added to itself
2253a8617a8SJordan K. Hubbardor to any finite number.  Its sign transforms
2263a8617a8SJordan K. Hubbardcorrectly through multiplication and division, and
2273a8617a8SJordan K. Hubbard.If (finite)/\(+- \0=\0\(+-0
2283a8617a8SJordan K. Hubbard(nonzero)/0 =
2293a8617a8SJordan K. Hubbard.If \(+- .
2303a8617a8SJordan K. HubbardBut
2313a8617a8SJordan K. Hubbard.if n \
2323a8617a8SJordan K. HubbardInfinity\-Infinity, Infinity\(**0 and Infinity/Infinity
2333a8617a8SJordan K. Hubbard.if t \
2343a8617a8SJordan K. Hubbard\(if\-\(if, \(if\(**0 and \(if/\(if
2353a8617a8SJordan K. Hubbardare, like 0/0 and sqrt(\-3),
2362a6bf1faSDavid Schultzinvalid operations that produce \*(Na. ...
2372a6bf1faSDavid Schultz.Ed
2383a8617a8SJordan K. HubbardReserved operands:
2392a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2403a8617a8SJordan K. Hubbardthere are 2**53\-2 of them, all
2412a6bf1faSDavid Schultzcalled \*(Na (\fIN\fRot \fIa N\fRumber).
2422a6bf1faSDavid SchultzSome, called Signaling \*(Nas, trap any floating\-point operation
2433a8617a8SJordan K. Hubbardperformed upon them; they are used to mark missing
2443a8617a8SJordan K. Hubbardor uninitialized values, or nonexistent elements
2452a6bf1faSDavid Schultzof arrays.  The rest are Quiet \*(Nas; they are
2463a8617a8SJordan K. Hubbardthe default results of Invalid Operations, and
2473a8617a8SJordan K. Hubbardpropagate through subsequent arithmetic operations.
2483a8617a8SJordan K. HubbardIf x
2493a8617a8SJordan K. Hubbard.if n \
2503a8617a8SJordan K. Hubbard!=
2513a8617a8SJordan K. Hubbard.if t \
2523a8617a8SJordan K. Hubbard\(!=
2532a6bf1faSDavid Schultzx then x is \*(Na; every other predicate
2542a6bf1faSDavid Schultz(x > y, x = y, x < y, ...) is FALSE if \*(Na is involved.
2553a8617a8SJordan K. Hubbard.br
2562a6bf1faSDavid SchultzNOTE: Trichotomy is violated by \*(Na.
2572a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2583a8617a8SJordan K. HubbardBesides being FALSE, predicates that entail ordered
2593a8617a8SJordan K. Hubbardcomparison, rather than mere (in)equality,
2602a6bf1faSDavid Schultzsignal Invalid Operation when \*(Na is involved.
2612a6bf1faSDavid Schultz.Ed
2622a6bf1faSDavid Schultz.Ed
2633a8617a8SJordan K. HubbardRounding:
2642a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2653a8617a8SJordan K. HubbardEvery algebraic operation (+, \-, \(**, /,
2663a8617a8SJordan K. Hubbard.if n \
2673a8617a8SJordan K. Hubbardsqrt)
2683a8617a8SJordan K. Hubbard.if t \
2693a8617a8SJordan K. Hubbard\(sr)
2703a8617a8SJordan K. Hubbardis rounded by default to within half an \*(up, and
2713a8617a8SJordan K. Hubbardwhen the rounding error is exactly half an \*(up then
2723a8617a8SJordan K. Hubbardthe rounded value's least significant bit is zero.
2733a8617a8SJordan K. HubbardThis kind of rounding is usually the best kind,
2743a8617a8SJordan K. Hubbardsometimes provably so; for instance, for every
2753a8617a8SJordan K. Hubbardx = 1.0, 2.0, 3.0, 4.0, ..., 2.0**52, we find
2763a8617a8SJordan K. Hubbard(x/3.0)\(**3.0 == x and (x/10.0)\(**10.0 == x and ...
2773a8617a8SJordan K. Hubbarddespite that both the quotients and the products
2783a8617a8SJordan K. Hubbardhave been rounded.  Only rounding like IEEE 754
2793a8617a8SJordan K. Hubbardcan do that.  But no single kind of rounding can be
2803a8617a8SJordan K. Hubbardproved best for every circumstance, so IEEE 754
2813a8617a8SJordan K. Hubbardprovides rounding towards zero or towards
2823a8617a8SJordan K. Hubbard.If +
2833a8617a8SJordan K. Hubbardor towards
2843a8617a8SJordan K. Hubbard.If \-
2853a8617a8SJordan K. Hubbardat the programmer's option.  And the
2863a8617a8SJordan K. Hubbardsame kinds of rounding are specified for
2873a8617a8SJordan K. HubbardBinary\-Decimal Conversions, at least for magnitudes
2883a8617a8SJordan K. Hubbardbetween roughly 1.0e\-10 and 1.0e37.
2892a6bf1faSDavid Schultz.Ed
2903a8617a8SJordan K. HubbardExceptions:
2912a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2923a8617a8SJordan K. HubbardIEEE 754 recognizes five kinds of floating\-point exceptions,
2933a8617a8SJordan K. Hubbardlisted below in declining order of probable importance.
2942a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
2953a8617a8SJordan K. Hubbard.nf
2963a8617a8SJordan K. Hubbard.ta \w'Invalid Operation'u+6n +\w'Gradual Underflow'u+2n
2973a8617a8SJordan K. HubbardException	Default Result
2983a8617a8SJordan K. Hubbard.tc \(ru
2993a8617a8SJordan K. Hubbard
3003a8617a8SJordan K. Hubbard.tc
3012a6bf1faSDavid SchultzInvalid Operation	\*(Na, or FALSE
3023a8617a8SJordan K. Hubbard.if n \{\
3033a8617a8SJordan K. HubbardOverflow	\(+-Infinity
3043a8617a8SJordan K. HubbardDivide by Zero	\(+-Infinity \}
3053a8617a8SJordan K. Hubbard.if t \{\
3063a8617a8SJordan K. HubbardOverflow	\(+-\(if
3073a8617a8SJordan K. HubbardDivide by Zero	\(+-\(if \}
3083a8617a8SJordan K. HubbardUnderflow	Gradual Underflow
3093a8617a8SJordan K. HubbardInexact	Rounded value
3103a8617a8SJordan K. Hubbard.ta
3113a8617a8SJordan K. Hubbard.fi
3122a6bf1faSDavid Schultz.Ed
3133a8617a8SJordan K. HubbardNOTE:  An Exception is not an Error unless handled
3143a8617a8SJordan K. Hubbardbadly.  What makes a class of exceptions exceptional
3153a8617a8SJordan K. Hubbardis that no single default response can be satisfactory
3163a8617a8SJordan K. Hubbardin every instance.  On the other hand, if a default
3173a8617a8SJordan K. Hubbardresponse will serve most instances satisfactorily,
3183a8617a8SJordan K. Hubbardthe unsatisfactory instances cannot justify aborting
3193a8617a8SJordan K. Hubbardcomputation every time the exception occurs.
3202a6bf1faSDavid Schultz.Ed
3212a6bf1faSDavid Schultz.Pp
3223a8617a8SJordan K. HubbardFor each kind of floating\-point exception, IEEE 754
3233a8617a8SJordan K. Hubbardprovides a Flag that is raised each time its exception
3243a8617a8SJordan K. Hubbardis signaled, and stays raised until the program resets
3253a8617a8SJordan K. Hubbardit.  Programs may also test, save and restore a flag.
3263a8617a8SJordan K. HubbardThus, IEEE 754 provides three ways by which programs
3273a8617a8SJordan K. Hubbardmay cope with exceptions for which the default result
3283a8617a8SJordan K. Hubbardmight be unsatisfactory:
3292a6bf1faSDavid Schultz.Bl -enum
3302a6bf1faSDavid Schultz.It
3313a8617a8SJordan K. HubbardTest for a condition that might cause an exception
3323a8617a8SJordan K. Hubbardlater, and branch to avoid the exception.
3332a6bf1faSDavid Schultz.It
3343a8617a8SJordan K. HubbardTest a flag to see whether an exception has occurred
3353a8617a8SJordan K. Hubbardsince the program last reset its flag.
3362a6bf1faSDavid Schultz.It
3373a8617a8SJordan K. HubbardTest a result to see whether it is a value that only
3383a8617a8SJordan K. Hubbardan exception could have produced.
3393a8617a8SJordan K. Hubbard.RS
3403a8617a8SJordan K. HubbardCAUTION: The only reliable ways to discover
3413a8617a8SJordan K. Hubbardwhether Underflow has occurred are to test whether
3423a8617a8SJordan K. Hubbardproducts or quotients lie closer to zero than the
3433a8617a8SJordan K. Hubbardunderflow threshold, or to test the Underflow
3443a8617a8SJordan K. Hubbardflag.  (Sums and differences cannot underflow in
3453a8617a8SJordan K. HubbardIEEE 754; if x
3463a8617a8SJordan K. Hubbard.if n \
3473a8617a8SJordan K. Hubbard!=
3483a8617a8SJordan K. Hubbard.if t \
3493a8617a8SJordan K. Hubbard\(!=
3503a8617a8SJordan K. Hubbardy then x\-y is correct to
3513a8617a8SJordan K. Hubbardfull precision and certainly nonzero regardless of
3523a8617a8SJordan K. Hubbardhow tiny it may be.)  Products and quotients that
3533a8617a8SJordan K. Hubbardunderflow gradually can lose accuracy gradually
3543a8617a8SJordan K. Hubbardwithout vanishing, so comparing them with zero
3553a8617a8SJordan K. Hubbard(as one might on a VAX) will not reveal the loss.
3563a8617a8SJordan K. HubbardFortunately, if a gradually underflowed value is
3573a8617a8SJordan K. Hubbarddestined to be added to something bigger than the
3583a8617a8SJordan K. Hubbardunderflow threshold, as is almost always the case,
3593a8617a8SJordan K. Hubbarddigits lost to gradual underflow will not be missed
3603a8617a8SJordan K. Hubbardbecause they would have been rounded off anyway.
3613a8617a8SJordan K. HubbardSo gradual underflows are usually \fIprovably\fR ignorable.
3623a8617a8SJordan K. HubbardThe same cannot be said of underflows flushed to 0.
3633a8617a8SJordan K. Hubbard.RE
3642a6bf1faSDavid Schultz.El
3652a6bf1faSDavid Schultz.Pp
3663a8617a8SJordan K. HubbardAt the option of an implementor conforming to IEEE 754,
3673a8617a8SJordan K. Hubbardother ways to cope with exceptions may be provided:
3682a6bf1faSDavid Schultz.Bl -hang -width 3n
3692a6bf1faSDavid Schultz.It 4.
3703a8617a8SJordan K. HubbardABORT.  This mechanism classifies an exception in
3713a8617a8SJordan K. Hubbardadvance as an incident to be handled by means
3723a8617a8SJordan K. Hubbardtraditionally associated with error\-handling
3733a8617a8SJordan K. Hubbardstatements like "ON ERROR GO TO ...".  Different
3743a8617a8SJordan K. Hubbardlanguages offer different forms of this statement,
3753a8617a8SJordan K. Hubbardbut most share the following characteristics:
3762a6bf1faSDavid Schultz.Bl -dash
3772a6bf1faSDavid Schultz.It
3783a8617a8SJordan K. HubbardNo means is provided to substitute a value for
3793a8617a8SJordan K. Hubbardthe offending operation's result and resume
3803a8617a8SJordan K. Hubbardcomputation from what may be the middle of an
3813a8617a8SJordan K. Hubbardexpression.  An exceptional result is abandoned.
3822a6bf1faSDavid Schultz.It
3833a8617a8SJordan K. HubbardIn a subprogram that lacks an error\-handling
3843a8617a8SJordan K. Hubbardstatement, an exception causes the subprogram to
3853a8617a8SJordan K. Hubbardabort within whatever program called it, and so
3863a8617a8SJordan K. Hubbardon back up the chain of calling subprograms until
3873a8617a8SJordan K. Hubbardan error\-handling statement is encountered or the
3883a8617a8SJordan K. Hubbardwhole task is aborted and memory is dumped.
3892a6bf1faSDavid Schultz.El
3902a6bf1faSDavid Schultz.It 5.
3913a8617a8SJordan K. HubbardSTOP.  This mechanism, requiring an interactive
3923a8617a8SJordan K. Hubbarddebugging environment, is more for the programmer
3933a8617a8SJordan K. Hubbardthan the program.  It classifies an exception in
3943a8617a8SJordan K. Hubbardadvance as a symptom of a programmer's error; the
3953a8617a8SJordan K. Hubbardexception suspends execution as near as it can to
3963a8617a8SJordan K. Hubbardthe offending operation so that the programmer can
3973a8617a8SJordan K. Hubbardlook around to see how it happened.  Quite often
3983a8617a8SJordan K. Hubbardthe first several exceptions turn out to be quite
3993a8617a8SJordan K. Hubbardunexceptionable, so the programmer ought ideally
4003a8617a8SJordan K. Hubbardto be able to resume execution after each one as if
4013a8617a8SJordan K. Hubbardexecution had not been stopped.
4022a6bf1faSDavid Schultz.It 6.
4033a8617a8SJordan K. Hubbard\&... Other ways lie beyond the scope of this document.
4042a6bf1faSDavid Schultz.El
4052a6bf1faSDavid Schultz.Ed
4062a6bf1faSDavid Schultz.Pp
4072a6bf1faSDavid SchultzIdeally, each
4083a8617a8SJordan K. Hubbardelementary function should act as if it were indivisible, or
4093a8617a8SJordan K. Hubbardatomic, in the sense that ...
4102a6bf1faSDavid Schultz.Bl -tag -width "iii)"
4112a6bf1faSDavid Schultz.It i)
4123a8617a8SJordan K. HubbardNo exception should be signaled that is not deserved by
4133a8617a8SJordan K. Hubbardthe data supplied to that function.
4142a6bf1faSDavid Schultz.It ii)
4153a8617a8SJordan K. HubbardAny exception signaled should be identified with that
4163a8617a8SJordan K. Hubbardfunction rather than with one of its subroutines.
4172a6bf1faSDavid Schultz.It iii)
4183a8617a8SJordan K. HubbardThe internal behavior of an atomic function should not
4193a8617a8SJordan K. Hubbardbe disrupted when a calling program changes from
4203a8617a8SJordan K. Hubbardone to another of the five or so ways of handling
4213a8617a8SJordan K. Hubbardexceptions listed above, although the definition
4223a8617a8SJordan K. Hubbardof the function may be correlated intentionally
4233a8617a8SJordan K. Hubbardwith exception handling.
4242a6bf1faSDavid Schultz.El
4252a6bf1faSDavid Schultz.Pp
4262a6bf1faSDavid SchultzThe functions in \fIlibm\fR are only approximately atomic.
4272a6bf1faSDavid SchultzThey signal no inappropriate exception except possibly ...
4282a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4293a8617a8SJordan K. HubbardOver/Underflow
4302a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4313a8617a8SJordan K. Hubbardwhen a result, if properly computed, might have lain barely within range, and
4322a6bf1faSDavid Schultz.Ed
4333a8617a8SJordan K. HubbardInexact in \fIcabs\fR, \fIcbrt\fR, \fIhypot\fR, \fIlog10\fR and \fIpow\fR
4342a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4353a8617a8SJordan K. Hubbardwhen it happens to be exact, thanks to fortuitous cancellation of errors.
4362a6bf1faSDavid Schultz.Ed
4372a6bf1faSDavid Schultz.Ed
4383a8617a8SJordan K. HubbardOtherwise, ...
4392a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4403a8617a8SJordan K. HubbardInvalid Operation is signaled only when
4412a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4422a6bf1faSDavid Schultzany result but \*(Na would probably be misleading.
4432a6bf1faSDavid Schultz.Ed
4443a8617a8SJordan K. HubbardOverflow is signaled only when
4452a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4463a8617a8SJordan K. Hubbardthe exact result would be finite but beyond the overflow threshold.
4472a6bf1faSDavid Schultz.Ed
4483a8617a8SJordan K. HubbardDivide\-by\-Zero is signaled only when
4492a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4503a8617a8SJordan K. Hubbarda function takes exactly infinite values at finite operands.
4512a6bf1faSDavid Schultz.Ed
4523a8617a8SJordan K. HubbardUnderflow is signaled only when
4532a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4543a8617a8SJordan K. Hubbardthe exact result would be nonzero but tinier than the underflow threshold.
4552a6bf1faSDavid Schultz.Ed
4563a8617a8SJordan K. HubbardInexact is signaled only when
4572a6bf1faSDavid Schultz.Bd -filled -offset indent -compact
4583a8617a8SJordan K. Hubbardgreater range or precision would be needed to represent the exact result.
4592a6bf1faSDavid Schultz.Ed
4602a6bf1faSDavid Schultz.Ed
4612a6bf1faSDavid Schultz.Sh BUGS
4622a6bf1faSDavid SchultzSeveral functions required by
4632a6bf1faSDavid Schultz.St -isoC-99
4642a6bf1faSDavid Schultzare missing, and many functions are not available in their
4652a6bf1faSDavid Schultz.Vt long double
4662a6bf1faSDavid Schultzvariants.
467dbc8f2b5SDavid Schultz.Pp
468dbc8f2b5SDavid SchultzOn some architectures, trigonometric argument reduction is not
469dbc8f2b5SDavid Schultzperformed accurately, resulting in errors greater than 1 ulp for large
470dbc8f2b5SDavid Schultzarguments to
471dbc8f2b5SDavid Schultz.Fn cos ,
472dbc8f2b5SDavid Schultz.Fn sin ,
473dbc8f2b5SDavid Schultzand
474dbc8f2b5SDavid Schultz.Fn tan .
4752a6bf1faSDavid Schultz.Sh SEE ALSO
4762a6bf1faSDavid Schultz.Xr fenv 3 ,
4772a6bf1faSDavid Schultz.Xr ieee 3
4782a6bf1faSDavid Schultz.Pp
4793a8617a8SJordan K. HubbardAn explanation of IEEE 754 and its proposed extension p854
4803a8617a8SJordan K. Hubbardwas published in the IEEE magazine MICRO in August 1984 under
4813a8617a8SJordan K. Hubbardthe title "A Proposed Radix\- and Word\-length\-independent
4823a8617a8SJordan K. HubbardStandard for Floating\-point Arithmetic" by W. J. Cody et al.
4833a8617a8SJordan K. HubbardThe manuals for Pascal, C and BASIC on the Apple Macintosh
4843a8617a8SJordan K. Hubbarddocument the features of IEEE 754 pretty well.
4852a6bf1faSDavid SchultzArticles in the IEEE magazine COMPUTER vol. 14 no. 3 (Mar.\&
4863a8617a8SJordan K. Hubbard1981), and in the ACM SIGNUM Newsletter Special Issue of
4873a8617a8SJordan K. HubbardOct. 1979, may be helpful although they pertain to
4883a8617a8SJordan K. Hubbardsuperseded drafts of the standard.
4892a6bf1faSDavid Schultz.Sh HISTORY
4902a6bf1faSDavid SchultzA math library with many of the present functions appeared in
4912a6bf1faSDavid SchultzVersion 7 AT&T UNIX.
4922a6bf1faSDavid SchultzThe library was substantially rewritten for 4.3BSD to provide
4932a6bf1faSDavid Schultzbetter accuracy and speed on machines supporting either VAX
4942a6bf1faSDavid Schultzor IEEE 754 floating-point.
4952a6bf1faSDavid SchultzMost of this library was replaced with FDLIBM, developed at Sun
4962a6bf1faSDavid SchultzMicrosystems, in
4972a6bf1faSDavid Schultz.Fx 1.1.5 .
498