unixdev.net


Switch to SpeakEasy.net DSL

The Modular Manual Browser

Home Page
Manual: (4.4BSD-Lite2)
Page:
Section:
Apropos / Subsearch:
optional field

IEEE(3)                     BSD Programmer's Manual                    IEEE(3)

NAME
     copysign, drem, finite, logb, scalb - IEEE 754 floating point support

SYNOPSIS
     #include <&lt;math.h>&gt;

     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. &gt; 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