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