IEEE(3) MachTen 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 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 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
double-precision floating-point and so chosen that 1 (<=
|x|2**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 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
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