1*86d7f5d3SJohn Marino /****************************************************************
2*86d7f5d3SJohn Marino
3*86d7f5d3SJohn Marino The author of this software is David M. Gay.
4*86d7f5d3SJohn Marino
5*86d7f5d3SJohn Marino Copyright (C) 1998, 1999 by Lucent Technologies
6*86d7f5d3SJohn Marino All Rights Reserved
7*86d7f5d3SJohn Marino
8*86d7f5d3SJohn Marino Permission to use, copy, modify, and distribute this software and
9*86d7f5d3SJohn Marino its documentation for any purpose and without fee is hereby
10*86d7f5d3SJohn Marino granted, provided that the above copyright notice appear in all
11*86d7f5d3SJohn Marino copies and that both that the copyright notice and this
12*86d7f5d3SJohn Marino permission notice and warranty disclaimer appear in supporting
13*86d7f5d3SJohn Marino documentation, and that the name of Lucent or any of its entities
14*86d7f5d3SJohn Marino not be used in advertising or publicity pertaining to
15*86d7f5d3SJohn Marino distribution of the software without specific, written prior
16*86d7f5d3SJohn Marino permission.
17*86d7f5d3SJohn Marino
18*86d7f5d3SJohn Marino LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
19*86d7f5d3SJohn Marino INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
20*86d7f5d3SJohn Marino IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
21*86d7f5d3SJohn Marino SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22*86d7f5d3SJohn Marino WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
23*86d7f5d3SJohn Marino IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24*86d7f5d3SJohn Marino ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
25*86d7f5d3SJohn Marino THIS SOFTWARE.
26*86d7f5d3SJohn Marino
27*86d7f5d3SJohn Marino ****************************************************************/
28*86d7f5d3SJohn Marino
29*86d7f5d3SJohn Marino /* Please send bug reports to David M. Gay (dmg at acm dot org,
30*86d7f5d3SJohn Marino * with " at " changed at "@" and " dot " changed to "."). */
31*86d7f5d3SJohn Marino
32*86d7f5d3SJohn Marino #include "gdtoaimp.h"
33*86d7f5d3SJohn Marino
34*86d7f5d3SJohn Marino double
ulp(x)35*86d7f5d3SJohn Marino ulp
36*86d7f5d3SJohn Marino #ifdef KR_headers
37*86d7f5d3SJohn Marino (x) U *x;
38*86d7f5d3SJohn Marino #else
39*86d7f5d3SJohn Marino (U *x)
40*86d7f5d3SJohn Marino #endif
41*86d7f5d3SJohn Marino {
42*86d7f5d3SJohn Marino Long L;
43*86d7f5d3SJohn Marino U a;
44*86d7f5d3SJohn Marino
45*86d7f5d3SJohn Marino L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
46*86d7f5d3SJohn Marino #ifndef Sudden_Underflow
47*86d7f5d3SJohn Marino if (L > 0) {
48*86d7f5d3SJohn Marino #endif
49*86d7f5d3SJohn Marino #ifdef IBM
50*86d7f5d3SJohn Marino L |= Exp_msk1 >> 4;
51*86d7f5d3SJohn Marino #endif
52*86d7f5d3SJohn Marino word0(&a) = L;
53*86d7f5d3SJohn Marino word1(&a) = 0;
54*86d7f5d3SJohn Marino #ifndef Sudden_Underflow
55*86d7f5d3SJohn Marino }
56*86d7f5d3SJohn Marino else {
57*86d7f5d3SJohn Marino L = -L >> Exp_shift;
58*86d7f5d3SJohn Marino if (L < Exp_shift) {
59*86d7f5d3SJohn Marino word0(&a) = 0x80000 >> L;
60*86d7f5d3SJohn Marino word1(&a) = 0;
61*86d7f5d3SJohn Marino }
62*86d7f5d3SJohn Marino else {
63*86d7f5d3SJohn Marino word0(&a) = 0;
64*86d7f5d3SJohn Marino L -= Exp_shift;
65*86d7f5d3SJohn Marino word1(&a) = L >= 31 ? 1 : 1 << (31 - L);
66*86d7f5d3SJohn Marino }
67*86d7f5d3SJohn Marino }
68*86d7f5d3SJohn Marino #endif
69*86d7f5d3SJohn Marino return dval(&a);
70*86d7f5d3SJohn Marino }
71