Annotation of src/lib/libm/src/s_trunc.c, Revision 1.3
1.1 xtraeme 1: /* @(#)s_floor.c 5.1 93/09/24 */
2: /*
3: * ====================================================
4: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5: *
6: * Developed at SunPro, a Sun Microsystems, Inc. business.
7: * Permission to use, copy, modify, and distribute this
8: * software is freely granted, provided that this notice
9: * is preserved.
10: * ====================================================
11: */
12:
1.2 hubertf 13: #include <sys/cdefs.h>
1.1 xtraeme 14: #if 0
15: __FBSDID("$FreeBSD: src/lib/msun/src/s_trunc.c,v 1.1 2004/06/20 09:25:43 das Exp $");
16: #endif
17: #if defined(LIBM_SCCS) && !defined(lint)
1.3 ! christos 18: __RCSID("$NetBSD: s_trunc.c,v 1.2 2007/01/17 23:24:22 hubertf Exp $");
1.1 xtraeme 19: #endif
20:
21: /*
22: * trunc(x)
23: * Return x rounded toward 0 to integral value
24: * Method:
25: * Bit twiddling.
26: * Exception:
27: * Inexact flag raised if x not equal to trunc(x).
28: */
29:
30: #include "math.h"
31: #include "math_private.h"
32:
33: static const double huge = 1.0e300;
34:
35: double
36: trunc(double x)
37: {
1.3 ! christos 38: int32_t i0,i1,jj0;
1.1 xtraeme 39: uint32_t i;
40: EXTRACT_WORDS(i0,i1,x);
1.3 ! christos 41: jj0 = ((i0>>20)&0x7ff)-0x3ff;
! 42: if(jj0<20) {
! 43: if(jj0<0) { /* raise inexact if x != 0 */
1.1 xtraeme 44: if(huge+x>0.0) {/* |x|<1, so return 0*sign(x) */
45: i0 &= 0x80000000U;
46: i1 = 0;
47: }
48: } else {
1.3 ! christos 49: i = (0x000fffff)>>jj0;
1.1 xtraeme 50: if(((i0&i)|i1)==0) return x; /* x is integral */
51: if(huge+x>0.0) { /* raise inexact flag */
52: i0 &= (~i); i1=0;
53: }
54: }
1.3 ! christos 55: } else if (jj0>51) {
! 56: if(jj0==0x400) return x+x; /* inf or NaN */
1.1 xtraeme 57: else return x; /* x is integral */
58: } else {
1.3 ! christos 59: i = ((u_int32_t)(0xffffffff))>>(jj0-20);
1.1 xtraeme 60: if((i1&i)==0) return x; /* x is integral */
61: if(huge+x>0.0) /* raise inexact flag */
62: i1 &= (~i);
63: }
64: INSERT_WORDS(x,i0,i1);
65: return x;
66: }
CVSweb <webmaster@jp.NetBSD.org>