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 integer nearest the exact value of x/y; moreover if \*(Ban - x/y\*(Ba = 1/2 then n is even. Consequently the remainder is computed exactly and \*(Bar\*(Ba \*(Bay\*(Ba/2. But drem(x, 0) is exceptional. (See below under DIAGNOSTICS.)

The finite() function returns the value 1 just when - x +; otherwise a zero is returned (when \*(Bax\*(Ba = or x is 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 (<= \*(Bax\*(Ba2**n < 2 unless x = 0 or (only on machines that conform to IEEE 754) \*(Bax\*(Ba = 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(\*(If, y) to be invalid operations that produce a . On the VAX, drem(x, 0) generates a reserved operand fault. No exists on a VAX.

IEEE 754 defines logb(±\*(If) = and logb(0) = -, 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(\*(Bax\*(Ba, -logb(x)) < Radix ... = 2 for IEEE 754

for every x except 0, and . Almost every program that assumes 754's specification will work correctly if logb() follows 854's specification instead.

IEEE 754 requires copysign(x, \*(Na)) = ±x but says nothing else about the sign of a . A (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?