Sanitize the markup, as prompted.
This commit is contained in:
parent
7a13f01f6f
commit
4e05ab77a8
@ -35,15 +35,13 @@
|
||||
.Dd June 11, 2004
|
||||
.Dt MATH 3
|
||||
.Os
|
||||
.ds up \fIulp\fR
|
||||
.de If
|
||||
.if n \\
|
||||
\\$1Infinity\\$2
|
||||
.if t \\
|
||||
\\$1\\(if\\$2
|
||||
..
|
||||
.if n \{\
|
||||
.char \[if] "Infinity
|
||||
.char \[sr] "sqrt
|
||||
.\}
|
||||
.Sh NAME
|
||||
math \- floating-point mathematical library
|
||||
.Nm math
|
||||
.Nd "floating-point mathematical library"
|
||||
.Sh LIBRARY
|
||||
.Lb libm
|
||||
.Sh SYNOPSIS
|
||||
@ -58,14 +56,14 @@ functions has a
|
||||
counterpart with an
|
||||
.Ql f
|
||||
appended to the name and a
|
||||
.Vt long double
|
||||
.Vt "long double"
|
||||
counterpart with an
|
||||
.Ql l
|
||||
appended.
|
||||
As an example, the
|
||||
.Vt float
|
||||
and
|
||||
.Vt long double
|
||||
.Vt "long double"
|
||||
counterparts of
|
||||
.Ft double
|
||||
.Fn acos "double x"
|
||||
@ -73,19 +71,22 @@ are
|
||||
.Ft float
|
||||
.Fn acosf "float x"
|
||||
and
|
||||
.Ft long double
|
||||
.Ft "long double"
|
||||
.Fn acosl "long double x" ,
|
||||
respectively.
|
||||
.Pp
|
||||
The programs are accurate to within the numbers
|
||||
of \*(ups tabulated below; an \*(up is one \fIU\fRnit in the \fIL\fRast
|
||||
\fIP\fRlace.
|
||||
.sp 2
|
||||
.nf
|
||||
.ta \w'nexttoward'u+10n +\w'remainder with partial quot'u
|
||||
\fIName\fP \fIDescription\fP \fIError Bound (ULPs)\fP
|
||||
.ta \w'nexttoward'u+4n +\w'remainder with partial quotient'u+6nC
|
||||
.sp 5p
|
||||
of
|
||||
.Em ulp Ns s
|
||||
tabulated below; an
|
||||
.Em ulp
|
||||
is one
|
||||
.Em U Ns nit
|
||||
in the
|
||||
.Em L Ns ast
|
||||
.Em P Ns lace .
|
||||
.Bl -column "nexttoward" "remainder with partial quotient"
|
||||
.Em "Name Description Error Bound (ULPs)"
|
||||
.\" XXX Many of these error bounds are wrong for the current implementation!
|
||||
acos inverse trigonometric function ???
|
||||
acosh inverse hyperbolic function ???
|
||||
@ -133,7 +134,7 @@ modf extract fractional part 0
|
||||
nearbyint round to integer 0
|
||||
nextafter next representable value 0
|
||||
.\" nexttoward next representable value 0
|
||||
pow exponential x**y 60\-500
|
||||
pow exponential x**y 60-500
|
||||
remainder remainder 0
|
||||
.\" remquo remainder with partial quotient ???
|
||||
rint round to nearest integer 0
|
||||
@ -150,8 +151,7 @@ trunc round towards zero 0
|
||||
y0 bessel function ???
|
||||
y1 bessel function ???
|
||||
yn bessel function ???
|
||||
.ta
|
||||
.fi
|
||||
.El
|
||||
.Sh NOTES
|
||||
Virtually all modern floating-point units attempt to support
|
||||
IEEE Standard 754 for Binary Floating-Point Arithmetic.
|
||||
@ -161,168 +161,144 @@ except for the few documented in
|
||||
it primarily defines representations of numbers and abstract
|
||||
properties of arithmetic operations relating to precision, rounding,
|
||||
and exceptional cases, as described below.
|
||||
.Pp
|
||||
\fBIEEE STANDARD 754 Floating\-Point Arithmetic:\fR
|
||||
.Pp
|
||||
.Ss IEEE STANDARD 754 Floating-Point Arithmetic
|
||||
.\" XXX mention single- and extended-/quad- precisions
|
||||
Properties of IEEE 754 Double\-Precision:
|
||||
.Bd -filled -offset indent
|
||||
Wordsize: 64 bits, 8 bytes. Radix: Binary.
|
||||
.br
|
||||
Precision: 53
|
||||
.if n \
|
||||
sig.
|
||||
.if t \
|
||||
significant
|
||||
bits, roughly like 16
|
||||
.if n \
|
||||
sig.
|
||||
.if t \
|
||||
significant
|
||||
decimals.
|
||||
.Bd -filled -offset indent -compact
|
||||
If x and x' are consecutive positive Double\-Precision
|
||||
numbers (they differ by 1 \*(up), then
|
||||
.br
|
||||
Properties of IEEE 754 Double-Precision:
|
||||
.Bd -ragged -offset indent -compact
|
||||
Wordsize: 64 bits, 8 bytes.
|
||||
.Pp
|
||||
Radix: Binary.
|
||||
.Pp
|
||||
Precision: 53 significant bits,
|
||||
roughly like 16 significant decimals.
|
||||
.Bd -ragged -offset indent -compact
|
||||
If x and x' are consecutive positive Double-Precision
|
||||
numbers (they differ by 1
|
||||
.Em ulp ) ,
|
||||
then
|
||||
.Bd -ragged -compact
|
||||
1.1e\-16 < 0.5**53 < (x'\-x)/x \(<= 0.5**52 < 2.3e\-16.
|
||||
.Ed
|
||||
.nf
|
||||
.ta \w'Range:'u+1n +\w'Underflow threshold'u+1n +\w'= 2.0**1024'u+1n
|
||||
.Ed
|
||||
.Pp
|
||||
.Bl -column "XXX" -compact
|
||||
Range: Overflow threshold = 2.0**1024 = 1.8e308
|
||||
Underflow threshold = 0.5**1022 = 2.2e\-308
|
||||
.ta
|
||||
.fi
|
||||
.Bd -filled -offset indent -compact
|
||||
Overflow goes by default to a signed
|
||||
.If "" .
|
||||
.br
|
||||
Underflow is \fIGradual,\fR rounding to the nearest
|
||||
.El
|
||||
.Bd -ragged -offset indent -compact
|
||||
Overflow goes by default to a signed \(if.
|
||||
Underflow is
|
||||
.Em Gradual ,
|
||||
rounding to the nearest
|
||||
integer multiple of 0.5**1074 = 4.9e\-324.
|
||||
.Ed
|
||||
.Pp
|
||||
Zero is represented ambiguously as +0 or \-0.
|
||||
.Bd -filled -offset indent -compact
|
||||
.Bd -ragged -offset indent -compact
|
||||
Its sign transforms correctly through multiplication or
|
||||
division, and is preserved by addition of zeros
|
||||
with like signs; but x\-x yields +0 for every
|
||||
finite x. The only operations that reveal zero's
|
||||
sign are division by zero and copysign(x,\(+-0).
|
||||
In particular, comparison (x > y, x \(>= y, etc.)
|
||||
finite x.
|
||||
The only operations that reveal zero's
|
||||
sign are division by zero and
|
||||
.Fn copysign x \(+-0 .
|
||||
In particular, comparison (x > y, x \(>= y, etc.)\&
|
||||
cannot be affected by the sign of zero; but if
|
||||
finite x = y then
|
||||
.If
|
||||
\&= 1/(x\-y)
|
||||
.if n \
|
||||
!=
|
||||
.if t \
|
||||
\(!=
|
||||
\-1/(y\-x) =
|
||||
.If \- .
|
||||
finite x = y then \(if = 1/(x\-y) \(!= \-1/(y\-x) = \-\(if.
|
||||
.Ed
|
||||
.If
|
||||
is signed.
|
||||
.Bd -filled -offset indent -compact
|
||||
it persists when added to itself
|
||||
or to any finite number. Its sign transforms
|
||||
.Pp
|
||||
\(if is signed.
|
||||
.Bd -ragged -offset indent -compact
|
||||
It persists when added to itself
|
||||
or to any finite number.
|
||||
Its sign transforms
|
||||
correctly through multiplication and division, and
|
||||
.If (finite)/\(+- \0=\0\(+-0
|
||||
(nonzero)/0 =
|
||||
.If \(+- .
|
||||
(finite)/\(+-\(if\0=\0\(+-0
|
||||
(nonzero)/0 = \(+-\(if.
|
||||
But
|
||||
.if n \
|
||||
Infinity\-Infinity, Infinity\(**0 and Infinity/Infinity
|
||||
.if t \
|
||||
\(if\-\(if, \(if\(**0 and \(if/\(if
|
||||
are, like 0/0 and sqrt(\-3),
|
||||
invalid operations that produce \*(Na. ...
|
||||
.Ed
|
||||
.Pp
|
||||
Reserved operands:
|
||||
.Bd -filled -offset indent -compact
|
||||
.Bd -ragged -offset indent -compact
|
||||
there are 2**53\-2 of them, all
|
||||
called \*(Na (\fIN\fRot \fIa N\fRumber).
|
||||
Some, called Signaling \*(Nas, trap any floating\-point operation
|
||||
called \*(Na
|
||||
.Em ( N Ns ot Em a N Ns umber ) .
|
||||
Some, called Signaling \*(Nas, trap any floating-point operation
|
||||
performed upon them; they are used to mark missing
|
||||
or uninitialized values, or nonexistent elements
|
||||
of arrays. The rest are Quiet \*(Nas; they are
|
||||
of arrays.
|
||||
The rest are Quiet \*(Nas; they are
|
||||
the default results of Invalid Operations, and
|
||||
propagate through subsequent arithmetic operations.
|
||||
If x
|
||||
.if n \
|
||||
!=
|
||||
.if t \
|
||||
\(!=
|
||||
x then x is \*(Na; every other predicate
|
||||
If x \(!= x then x is \*(Na; every other predicate
|
||||
(x > y, x = y, x < y, ...) is FALSE if \*(Na is involved.
|
||||
.br
|
||||
.Pp
|
||||
NOTE: Trichotomy is violated by \*(Na.
|
||||
.Bd -filled -offset indent -compact
|
||||
Besides being FALSE, predicates that entail ordered
|
||||
comparison, rather than mere (in)equality,
|
||||
signal Invalid Operation when \*(Na is involved.
|
||||
.Ed
|
||||
.Ed
|
||||
.Pp
|
||||
Rounding:
|
||||
.Bd -filled -offset indent -compact
|
||||
.Bd -ragged -offset indent -compact
|
||||
Every algebraic operation (+, \-, \(**, /,
|
||||
.if n \
|
||||
sqrt)
|
||||
.if t \
|
||||
\(sr)
|
||||
is rounded by default to within half an \*(up, and
|
||||
when the rounding error is exactly half an \*(up then
|
||||
is rounded by default to within half an
|
||||
.Em ulp ,
|
||||
and when the rounding error is exactly half an
|
||||
.Em ulp
|
||||
then
|
||||
the rounded value's least significant bit is zero.
|
||||
This kind of rounding is usually the best kind,
|
||||
sometimes provably so; for instance, for every
|
||||
x = 1.0, 2.0, 3.0, 4.0, ..., 2.0**52, we find
|
||||
(x/3.0)\(**3.0 == x and (x/10.0)\(**10.0 == x and ...
|
||||
despite that both the quotients and the products
|
||||
have been rounded. Only rounding like IEEE 754
|
||||
can do that. But no single kind of rounding can be
|
||||
have been rounded.
|
||||
Only rounding like IEEE 754 can do that.
|
||||
But no single kind of rounding can be
|
||||
proved best for every circumstance, so IEEE 754
|
||||
provides rounding towards zero or towards
|
||||
.If +
|
||||
or towards
|
||||
.If \-
|
||||
at the programmer's option. And the
|
||||
+\(if or towards \-\(if
|
||||
at the programmer's option.
|
||||
And the
|
||||
same kinds of rounding are specified for
|
||||
Binary\-Decimal Conversions, at least for magnitudes
|
||||
Binary-Decimal Conversions, at least for magnitudes
|
||||
between roughly 1.0e\-10 and 1.0e37.
|
||||
.Ed
|
||||
.Pp
|
||||
Exceptions:
|
||||
.Bd -filled -offset indent -compact
|
||||
IEEE 754 recognizes five kinds of floating\-point exceptions,
|
||||
.Bd -ragged -offset indent -compact
|
||||
IEEE 754 recognizes five kinds of floating-point exceptions,
|
||||
listed below in declining order of probable importance.
|
||||
.Bd -filled -offset indent -compact
|
||||
.nf
|
||||
.ta \w'Invalid Operation'u+6n +\w'Gradual Underflow'u+2n
|
||||
Exception Default Result
|
||||
.tc \(ru
|
||||
|
||||
.tc
|
||||
.Bl -column -offset indent "Invalid Operation" "Gradual Underflow"
|
||||
.Em "Exception Default Result"
|
||||
Invalid Operation \*(Na, or FALSE
|
||||
.if n \{\
|
||||
Overflow \(+-Infinity
|
||||
Divide by Zero \(+-Infinity \}
|
||||
.if t \{\
|
||||
Overflow \(+-\(if
|
||||
Divide by Zero \(+-\(if \}
|
||||
Divide by Zero \(+-\(if
|
||||
Underflow Gradual Underflow
|
||||
Inexact Rounded value
|
||||
.ta
|
||||
.fi
|
||||
.Ed
|
||||
.El
|
||||
.Pp
|
||||
NOTE: An Exception is not an Error unless handled
|
||||
badly. What makes a class of exceptions exceptional
|
||||
badly.
|
||||
What makes a class of exceptions exceptional
|
||||
is that no single default response can be satisfactory
|
||||
in every instance. On the other hand, if a default
|
||||
in every instance.
|
||||
On the other hand, if a default
|
||||
response will serve most instances satisfactorily,
|
||||
the unsatisfactory instances cannot justify aborting
|
||||
computation every time the exception occurs.
|
||||
.Ed
|
||||
.Pp
|
||||
For each kind of floating\-point exception, IEEE 754
|
||||
For each kind of floating-point exception, IEEE 754
|
||||
provides a Flag that is raised each time its exception
|
||||
is signaled, and stays raised until the program resets
|
||||
it. Programs may also test, save and restore a flag.
|
||||
it.
|
||||
Programs may also test, save and restore a flag.
|
||||
Thus, IEEE 754 provides three ways by which programs
|
||||
may cope with exceptions for which the default result
|
||||
might be unsatisfactory:
|
||||
@ -336,20 +312,17 @@ since the program last reset its flag.
|
||||
.It
|
||||
Test a result to see whether it is a value that only
|
||||
an exception could have produced.
|
||||
.RS
|
||||
.Pp
|
||||
CAUTION: The only reliable ways to discover
|
||||
whether Underflow has occurred are to test whether
|
||||
products or quotients lie closer to zero than the
|
||||
underflow threshold, or to test the Underflow
|
||||
flag. (Sums and differences cannot underflow in
|
||||
IEEE 754; if x
|
||||
.if n \
|
||||
!=
|
||||
.if t \
|
||||
\(!=
|
||||
y then x\-y is correct to
|
||||
flag.
|
||||
(Sums and differences cannot underflow in
|
||||
IEEE 754; if x \(!= y then x\-y is correct to
|
||||
full precision and certainly nonzero regardless of
|
||||
how tiny it may be.) Products and quotients that
|
||||
how tiny it may be.)
|
||||
Products and quotients that
|
||||
underflow gradually can lose accuracy gradually
|
||||
without vanishing, so comparing them with zero
|
||||
(as one might on a VAX) will not reveal the loss.
|
||||
@ -358,19 +331,22 @@ destined to be added to something bigger than the
|
||||
underflow threshold, as is almost always the case,
|
||||
digits lost to gradual underflow will not be missed
|
||||
because they would have been rounded off anyway.
|
||||
So gradual underflows are usually \fIprovably\fR ignorable.
|
||||
So gradual underflows are usually
|
||||
.Em provably
|
||||
ignorable.
|
||||
The same cannot be said of underflows flushed to 0.
|
||||
.RE
|
||||
.El
|
||||
.Pp
|
||||
At the option of an implementor conforming to IEEE 754,
|
||||
other ways to cope with exceptions may be provided:
|
||||
.Bl -hang -width 3n
|
||||
.It 4.
|
||||
ABORT. This mechanism classifies an exception in
|
||||
.Bl -enum
|
||||
.It
|
||||
ABORT.
|
||||
This mechanism classifies an exception in
|
||||
advance as an incident to be handled by means
|
||||
traditionally associated with error\-handling
|
||||
statements like "ON ERROR GO TO ...". Different
|
||||
traditionally associated with error-handling
|
||||
statements like "ON ERROR GO TO ...".
|
||||
Different
|
||||
languages offer different forms of this statement,
|
||||
but most share the following characteristics:
|
||||
.Bl -dash
|
||||
@ -378,28 +354,32 @@ but most share the following characteristics:
|
||||
No means is provided to substitute a value for
|
||||
the offending operation's result and resume
|
||||
computation from what may be the middle of an
|
||||
expression. An exceptional result is abandoned.
|
||||
expression.
|
||||
An exceptional result is abandoned.
|
||||
.It
|
||||
In a subprogram that lacks an error\-handling
|
||||
In a subprogram that lacks an error-handling
|
||||
statement, an exception causes the subprogram to
|
||||
abort within whatever program called it, and so
|
||||
on back up the chain of calling subprograms until
|
||||
an error\-handling statement is encountered or the
|
||||
an error-handling statement is encountered or the
|
||||
whole task is aborted and memory is dumped.
|
||||
.El
|
||||
.It 5.
|
||||
STOP. This mechanism, requiring an interactive
|
||||
.It
|
||||
STOP.
|
||||
This mechanism, requiring an interactive
|
||||
debugging environment, is more for the programmer
|
||||
than the program. It classifies an exception in
|
||||
than the program.
|
||||
It classifies an exception in
|
||||
advance as a symptom of a programmer's error; the
|
||||
exception suspends execution as near as it can to
|
||||
the offending operation so that the programmer can
|
||||
look around to see how it happened. Quite often
|
||||
look around to see how it happened.
|
||||
Quite often
|
||||
the first several exceptions turn out to be quite
|
||||
unexceptionable, so the programmer ought ideally
|
||||
to be able to resume execution after each one as if
|
||||
execution had not been stopped.
|
||||
.It 6.
|
||||
.It
|
||||
\&... Other ways lie beyond the scope of this document.
|
||||
.El
|
||||
.Ed
|
||||
@ -407,14 +387,14 @@ execution had not been stopped.
|
||||
Ideally, each
|
||||
elementary function should act as if it were indivisible, or
|
||||
atomic, in the sense that ...
|
||||
.Bl -tag -width "iii)"
|
||||
.It i)
|
||||
.Bl -enum
|
||||
.It
|
||||
No exception should be signaled that is not deserved by
|
||||
the data supplied to that function.
|
||||
.It ii)
|
||||
.It
|
||||
Any exception signaled should be identified with that
|
||||
function rather than with one of its subroutines.
|
||||
.It iii)
|
||||
.It
|
||||
The internal behavior of an atomic function should not
|
||||
be disrupted when a calling program changes from
|
||||
one to another of the five or so ways of handling
|
||||
@ -423,51 +403,60 @@ of the function may be correlated intentionally
|
||||
with exception handling.
|
||||
.El
|
||||
.Pp
|
||||
The functions in \fIlibm\fR are only approximately atomic.
|
||||
The functions in
|
||||
.Nm libm
|
||||
are only approximately atomic.
|
||||
They signal no inappropriate exception except possibly ...
|
||||
.Bd -filled -offset indent -compact
|
||||
.Bl -tag -width indent -offset indent -compact
|
||||
.It Xo
|
||||
Over/Underflow
|
||||
.Bd -filled -offset indent -compact
|
||||
.Xc
|
||||
when a result, if properly computed, might have lain barely within range, and
|
||||
.Ed
|
||||
Inexact in \fIcabs\fR, \fIcbrt\fR, \fIhypot\fR, \fIlog10\fR and \fIpow\fR
|
||||
.Bd -filled -offset indent -compact
|
||||
.It Xo
|
||||
Inexact in
|
||||
.Fn cabs ,
|
||||
.Fn cbrt ,
|
||||
.Fn hypot ,
|
||||
.Fn log10
|
||||
and
|
||||
.Fn pow
|
||||
.Xc
|
||||
when it happens to be exact, thanks to fortuitous cancellation of errors.
|
||||
.Ed
|
||||
.Ed
|
||||
.El
|
||||
Otherwise, ...
|
||||
.Bd -filled -offset indent -compact
|
||||
.Bl -tag -width indent -offset indent -compact
|
||||
.It Xo
|
||||
Invalid Operation is signaled only when
|
||||
.Bd -filled -offset indent -compact
|
||||
.Xc
|
||||
any result but \*(Na would probably be misleading.
|
||||
.Ed
|
||||
.It Xo
|
||||
Overflow is signaled only when
|
||||
.Bd -filled -offset indent -compact
|
||||
.Xc
|
||||
the exact result would be finite but beyond the overflow threshold.
|
||||
.Ed
|
||||
Divide\-by\-Zero is signaled only when
|
||||
.Bd -filled -offset indent -compact
|
||||
.It Xo
|
||||
Divide-by-Zero is signaled only when
|
||||
.Xc
|
||||
a function takes exactly infinite values at finite operands.
|
||||
.Ed
|
||||
.It Xo
|
||||
Underflow is signaled only when
|
||||
.Bd -filled -offset indent -compact
|
||||
.Xc
|
||||
the exact result would be nonzero but tinier than the underflow threshold.
|
||||
.Ed
|
||||
.It Xo
|
||||
Inexact is signaled only when
|
||||
.Bd -filled -offset indent -compact
|
||||
.Xc
|
||||
greater range or precision would be needed to represent the exact result.
|
||||
.Ed
|
||||
.Ed
|
||||
.El
|
||||
.Sh BUGS
|
||||
Several functions required by
|
||||
.St -isoC-99
|
||||
are missing, and many functions are not available in their
|
||||
.Vt long double
|
||||
.Vt "long double"
|
||||
variants.
|
||||
.Pp
|
||||
On some architectures, trigonometric argument reduction is not
|
||||
performed accurately, resulting in errors greater than 1 ulp for large
|
||||
arguments to
|
||||
performed accurately, resulting in errors greater than 1
|
||||
.Em ulp
|
||||
for large arguments to
|
||||
.Fn cos ,
|
||||
.Fn sin ,
|
||||
and
|
||||
@ -478,8 +467,8 @@ and
|
||||
.Pp
|
||||
An explanation of IEEE 754 and its proposed extension p854
|
||||
was published in the IEEE magazine MICRO in August 1984 under
|
||||
the title "A Proposed Radix\- and Word\-length\-independent
|
||||
Standard for Floating\-point Arithmetic" by W. J. Cody et al.
|
||||
the title "A Proposed Radix- and Word-length-independent
|
||||
Standard for Floating-point Arithmetic" by W. J. Cody et al.
|
||||
The manuals for Pascal, C and BASIC on the Apple Macintosh
|
||||
document the features of IEEE 754 pretty well.
|
||||
Articles in the IEEE magazine COMPUTER vol. 14 no. 3 (Mar.\&
|
||||
@ -488,8 +477,10 @@ Oct. 1979, may be helpful although they pertain to
|
||||
superseded drafts of the standard.
|
||||
.Sh HISTORY
|
||||
A math library with many of the present functions appeared in
|
||||
Version 7 AT&T UNIX.
|
||||
The library was substantially rewritten for 4.3BSD to provide
|
||||
.At v7 .
|
||||
The library was substantially rewritten for
|
||||
.Bx 4.3
|
||||
to provide
|
||||
better accuracy and speed on machines supporting either VAX
|
||||
or IEEE 754 floating-point.
|
||||
Most of this library was replaced with FDLIBM, developed at Sun
|
||||
|
Loading…
x
Reference in New Issue
Block a user