1IEEE(3M) IEEE(3M)
2
3
4
6 copysign, drem, finite, logb, scalb - copysign, remainder, exponent
7 manipulations
8
10 #include <math.h>
11
12 double copysign(x,y)
13 double x,y;
14
15 double drem(x,y)
16 double x,y;
17
18 int finite(x)
19 double x;
20
21 double logb(x)
22 double x;
23
24 double scalb(x,n)
25 double x;
26 int n;
27
29 These functions are required for, or recommended by the IEEE standard
30 754 for floating-point arithmetic.
31
32 Copysign(x,y) returns x with its sign changed to y's.
33
34 Drem(x,y) returns the remainder r := x - n∗y where n is the integer
35 nearest the exact value of x/y; moreover if |n-x/y|=1/2 then n is even.
36 Consequently the remainder is computed exactly and |r| ≤ |y|/2. But
37 drem(x,0) is exceptional; see below under DIAGNOSTICS.
38
39 Finite(x) = 1 just when -infinity < x < +infinity,
40 = 0 otherwise (when |x| = infinity or x is NaN or
41 x is the VAX's reserved operand.)
42
43 Logb(x) returns x's exponent n, a signed integer converted to dou‐
44 ble-precision floating-point and so chosen that 1 ≤ |x|/2**n < 2 unless
45 x = 0 or (only on machines that conform to IEEE 754) |x| = infinity or
46 x lies between 0 and the Underflow Threshold; see below under "BUGS".
47
48 Scalb(x,n) = x∗(2**n) computed, for integer n, without first computing
49 2**n.
50
52 IEEE 754 defines drem(x,0) and drem(infinity,y) to be invalid opera‐
53 tions that produce a NaN. On a VAX, drem(x,0) returns the reserved op‐
54 erand. No infinity exists on a VAX.
55
56 IEEE 754 defines logb(±infinity) = +infinity and logb(0) = -infinity,
57 requires the latter to signal Division-by-Zero. But on a VAX, logb(0)
58 = 1.0 - 2.0**31 = -2,147,483,647.0. And if the correct value of
59 scalb(x,n) would overflow on a VAX, it returns the reserved operand and
60 sets errno to ERANGE.
61
63 floor(3M), math(3M), infnan(3M)
64
66 Kwok-Choi Ng
67
69 Should drem(x,0) and logb(0) on a VAX signal invalidity by setting
70 errno = EDOM? Should logb(0) return -1.7e38?
71
72 IEEE 754 currently specifies that logb(denormalized no.) = logb(tiniest
73 normalized no. > 0) but the consensus has changed to the specification
74 in the new proposed IEEE standard p854, namely that logb(x) satisfy
75 1 ≤ scalb(|x|,-logb(x)) < Radix ... = 2 for IEEE 754
76 for every x except 0, infinity and NaN. Almost every program that
77 assumes 754's specification will work correctly if logb follows 854's
78 specification instead.
79
80 IEEE 754 requires copysign(x,NaN) = ±x but says nothing else about the
81 sign of a NaN. A NaN (Not a Number) is similar in spirit to the VAX's
82 reserved operand, but very different in important details. Since the
83 sign bit of a reserved operand makes it look negative,
84 copysign(x,reserved operand) = -x;
85 should this return the reserved operand instead?
86
87
88
894.3 Berkeley Distribution May 12, 1986 IEEE(3M)