4.3BSD-UWisc/man/cat3/ieee.3m




IEEE(3M)            UNIX Programmer's Manual             IEEE(3M)



NAME
     copysign, drem, finite, logb, scalb - copysign, remainder,
     exponent manipulations

SYNOPSIS
     #include <math.h>

     double copysign(x,y)
     double x,y;

     double drem(x,y)
     double x,y;

     int finite(x)
     double x;

     double logb(x)
     double x;

     double scalb(x,n)
     double x;
     int n;

DESCRIPTION
     These functions are required for, or recommended by the IEEE
     standard 754 for floating-point arithmetic.

     Copysign(x,y) returns x with its sign changed to y's.

     Drem(x,y) returns the remainder r := x - n*y where n is the
     integer 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 excep-
     tional; see below under DIAGNOSTICS.

     Finite(x) = 1 just when -infinity < x < +infinity,
               = 0 otherwise (when |x| = infinity or x is _N_a_N or
                              x is the VAX's reserved operand.)

     Logb(x) returns x's exponent n, a signed integer converted
     to double-precision floating-point and so chosen that
     1 <_ |x|/2**n < 2 unless x = 0 or (only on machines that con-
     form to IEEE 754) |x| = infinity or x lies between 0 and the
     Underflow Threshold; see below under "BUGS".

     Scalb(x,n) = x*(2**n) computed, for integer n, without first
     computing 2**n.

DIAGNOSTICS
     IEEE 754 defines drem(x,0) and drem(infinity,y) to be
     invalid operations that produce a _N_a_N.  On a VAX, drem(x,0)
     returns the reserved operand.  No infinity exists on a VAX.



Printed 12/27/86          May 12, 1986                          1






IEEE(3M)            UNIX Programmer's Manual             IEEE(3M)



     IEEE 754 defines logb(+_infinity) = +infinity and logb(0) =
     -infinity, 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(x,n) would overflow on a
     VAX, it returns the reserved operand and sets _e_r_r_n_o to
     ERANGE.

SEE ALSO
     floor(3M), math(3M), infnan(3M)

AUTHOR
     Kwok-Choi Ng

BUGS
     Should drem(x,0) and logb(0) on a VAX signal invalidity by
     setting _e_r_r_n_o = 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 stan-
     dard p854, namely that logb(x) satisfy
          1 <_ scalb(|x|,-logb(x)) < Radix   ... = 2 for IEEE 754
     for every x except 0, infinity and _N_a_N.  Almost every pro-
     gram that assumes 754's specification will work correctly if
     logb follows 854's specification instead.

     IEEE 754 requires copysign(x,_N_a_N) = +_x  but says nothing
     else about the sign of a _N_a_N.  A _N_a_N (_Not _a _Number) is simi-
     lar in spirit to the VAX's reserved operand, but very dif-
     ferent 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?






















Printed 12/27/86          May 12, 1986                          2