IEEE(3) BSD Programmer's Manual IEEE(3)
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 floatingpoint 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 in
teger 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 < +in
finity; 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
doubleprecision floatingpoint and so chosen that 1 (<= x2**n < 2 un
less 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 in
valid 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 DivisionbyZero. 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
floor(3), math(3), infnan(3)
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
1 <= scalb(x, logb(x)) < Radix ... = 2 for IEEE 754
for every x except 0, infinity and NaN. Almost every program that as
sumes 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?
4.3 Berkeley Distribution June 4, 1993 2
