xref: /original-bsd/lib/libm/common_source/ieee.3 (revision f955cb91)
1.\" Copyright (c) 1985, 1991 Regents of the University of California.
2.\" All rights reserved.
3.\"
4.\" %sccs.include.redist.roff%
5.\"
6.\"     @(#)ieee.3	6.4 (Berkeley) 05/06/91
7.\"
8.Dd
9.Dt IEEE 3
10.Os BSD 4.3
11.Sh NAME
12.Nm copysign ,
13.Nm drem ,
14.Nm finite ,
15.Nm logb ,
16.Nm scalb
17.Nm copysign ,
18.Nm remainder,
19.Nd exponent manipulations
20.Sh SYNOPSIS
21.Fd #include <math.h>
22.Ft double
23.Fn copysign "double x" "double y"
24.Ft double
25.Fn drem "double x" "double y"
26.Ft int
27.Fn finite "double x"
28.Ft double
29.Fn logb "double x"
30.Ft double
31.Fn scalb "double x" "int n"
32.Sh DESCRIPTION
33These functions are required for, or recommended by the
34.Tn IEEE
35standard
36754 for floating\-point arithmetic.
37.Pp
38The
39.Fn copysign
40function
41returns
42.Fa x
43with its sign changed to
44.Fa y Ns 's.
45.Pp
46The
47.Fn drem
48function
49returns the remainder
50.Fa r
51:=
52.Fa x
53\-
54.Fa n\(**y
55where
56.Fa n
57is the integer nearest the exact value of
58.Bk -words
59.Fa x Ns / Ns Fa y ;
60.Ek
61moreover if
62.Pf \\*(Ba Fa n
63\-
64.Sm off
65.Fa x No / Fa y No \\*(Ba
66.Sm on
67=
681/2
69then
70.Fa n
71is even.  Consequently
72the remainder is computed exactly and
73.Sm off
74.Pf \\*(Ba Fa r No \\*(Ba
75.Sm on
76\*(Le
77.Sm off
78.Pf \\*(Ba Fa y No \\*(Ba/2.
79.Sm on
80But
81.Fn drem x 0
82is exceptional.
83(See below under
84.Sx DIAGNOSTICS . )
85.Pp
86The
87.Fn finite
88function returns the value 1 just when
89\-\*(If \*(Lt
90.Fa x
91\*(Lt +\*(If;
92otherwise a
93zero is returned
94(when
95.Pf \\*(Ba Ns Fa x Ns \\*(Ba
96= \*(If or
97.Fa x
98is \*(Na or
99is the
100.Tn VAX Ns 's
101reserved operand).
102.Pp
103The
104.Fn logb
105function returns
106.Fa x Ns 's exponent
107.Fa n ,
108a signed integer converted to double\-precision floating\-point and so
109chosen that
1101 (<=
111.Pf \\*(Ba Ns Fa x Ns \\*(Ba2** Ns Fa n
112< 2
113unless
114.Fa x
115= 0 or
116(only on machines that conform to
117.Tn IEEE
118754)
119.Pf \\*(Ba Fa x Ns \\*(Ba
120= \*(If
121or
122.Fa x
123lies between 0 and the Underflow Threshold.
124(See below under
125.Sx BUGS . )
126.Pp
127The
128Fn calb
129returns
130.Fa x Ns \(**(2** Ns Fa n )
131computed, for integer n, without first computing
132.Pf 2\(** Fa n .
133.Sh RETURN VALUES
134The
135.Tn IEEE
136standard
137754 defines
138.Fn drem x 0
139and
140.Fn drem \\*(If y
141to be invalid operations that produce a \*(Na.
142On the
143.Tn VAX ,
144.Fn drem x 0
145generates a reserved operand fault.  No \*(If
146exists on a
147.Tn VAX .
148.Pp
149.Tn IEEE
150754 defines
151.if n \
152.Fn logb \(+-\\*(If
153= \*(If and
154.Fn logb 0
155= \-\*(If, and
156requires the latter to signal Division\-by\-Zero.
157But on a
158.Tn VAX ,
159.Fn logb 0
160= 1.0 \- 2.0**31 = \-2,147,483,647.0.
161And if the correct value of
162.Fn scalb
163would overflow on a
164.Tn VAX ,
165it generates a reserved operand fault and sets the global variable
166.Va errno
167to
168.Dv ERANGE .
169.Sh SEE ALSO
170.Xr floor 3 ,
171.Xr math 3 ,
172.Xr infnan 3
173.Sh HISTORY
174The
175.Nm ieee
176functions appeared in
177.Bx 4.3 .
178.Sh BUGS
179Should
180.Fn drem x 0
181and
182.Fn logb 0
183on a
184.Tn VAX
185signal invalidity
186by setting
187.Va errno No = Dv EDOM ?
188Should
189.Fn logb 0
190return  \-1.7e38?
191.Pp
192.Tn IEEE
193754 currently specifies that
194.Fn logb "denormalized no."
195=
196.Fn logb "tiniest normalized no. > 0"
197but the consensus has changed to the specification in the new
198proposed
199.Tn IEEE
200standard p854, namely that
201.Fn logb x
202satisfy
203.Bd -filled -offset indent
2041 \(<=
205.Fn scalb \\*(Bax\\*(Ba \-logb(x)
206<
207Radix\0 ... = 2
208for
209.Tn IEEE
210754
211.Ed
212.Pp
213for every x except 0,
214\*(If
215and \*(Na.
216Almost every program that assumes 754's specification will work
217correctly if
218.Fn logb
219follows 854's specification instead.
220.Pp
221.Tn IEEE
222754 requires
223.Fn copysign x \\*(Na)
224=
225.Pf \(+- Ns Fa x
226but says nothing
227else about the sign of a \*(Na.  A \*(Na
228.Em N Ns ot
229.Em a
230.Em N Ns umber )
231is
232similar in spirit to the
233.Tn VAX Ns 's
234reserved operand, but very
235different in important details.  Since the sign bit of a
236reserved operand makes it look negative,
237.Bd -filled -offset indent
238.Fn copysign x "reserved operand"
239=
240.Pf \- Fa x ;
241.Ed
242.Pp
243should this return the reserved operand instead?
244