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