NAME
copysign, drem,
finite, logb,
scalb —
IEEE 754 floating point
support
SYNOPSIS
#include
<math.h>
double
copysign(double
x, double y);
double
drem(double
x, double y);
int
finite(double
x);
double
logb(double
x);
double
scalb(double
x, int n);
DESCRIPTION
These functions are required for, or recommended by the IEEE standard 754 for floating-point arithmetic.The
copysign()
function returns x with its sign changed to
y's.
The
drem()
function returns the remainder r :=
x - n∗y where
n is the integer nearest the exact value of
x/y; moreover if
|n -
x/y| =
1/2 then n is even. Consequently the remainder is
computed exactly and |r| ≤
|y|/2. But
drem(x,
0) is exceptional. (See below under
DIAGNOSTICS.)
The
finite()
function returns the value 1 just when -infinity <
x < +infinity; otherwise a zero is returned (when
|x| = infinity or x is NaN or is
the VAX's reserved operand).
The
logb()
function returns x's exponent n,
a signed integer converted to double-precision floating-point and so chosen
that 1 (<= |x|2**n < 2
unless x = 0 or (only on machines that conform to IEEE
754) |x| = infinity or x lies
between 0 and the Underflow Threshold. (See below under
BUGS.)
The
scalb()
function returns x∗(2**n)
computed, for integer n, without first computing
2∗n.
RETURN VALUES
The IEEE standard 754 defines
drem(x,
0) and
drem(infinity,
y) to be invalid operations that produce a NaN. On the
VAX, drem(x,
0) generates a reserved operand fault. No infinity
exists on a VAX.
IEEE 754 defines
logb(±infinity) =
infinity and logb(0) =
-infinity, and requires the latter to signal Division-by-Zero. But on a VAX,
logb(0) = 1.0 - 2.0**31 =
-2,147,483,647.0. And if the correct value of
scalb() would overflow on a VAX, it generates a
reserved operand fault and sets the global variable
errno to ERANGE.
SEE ALSO
HISTORY
The ieee functions appeared in
4.3BSD.
BUGS
Should drem(x,
0) and
logb(0) on a VAX signal
invalidity by setting errno =
EDOM? Should
logb(0) return -1.7e38?
IEEE 754 currently specifies that
logb(denormalized no.) =
logb(tiniest normalized no. >
0) but the consensus has changed to the specification in the new
proposed IEEE standard p854, namely that
logb(x) satisfy
scalb(|x|,
-logb(x)) < Radix ... = 2 for IEEE 754for every x except 0, infinity and NaN. Almost every program that
assumes 754's specification will work correctly if
logb() follows 854's specification instead.
IEEE 754 requires
copysign(x,
NaN)) = ±x but says
nothing else about the sign of a NaN. A NaN
(Not
a
Number) is
similar in spirit to the VAX's reserved operand, but very different in
important details. Since the sign bit of a reserved operand makes it look
negative,
copysign(x,
reserved operand) = -x;should this return the reserved operand instead?