Annotation of src/lib/libm/src/s_ceilf.c, Revision 1.8
1.1 jtc 1: /* s_ceilf.c -- float version of s_ceil.c.
2: * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3: */
4:
5: /*
6: * ====================================================
7: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8: *
9: * Developed at SunPro, a Sun Microsystems, Inc. business.
10: * Permission to use, copy, modify, and distribute this
1.6 simonb 11: * software is freely granted, provided that this notice
1.1 jtc 12: * is preserved.
13: * ====================================================
14: */
15:
1.5 lukem 16: #include <sys/cdefs.h>
1.3 jtc 17: #if defined(LIBM_SCCS) && !defined(lint)
1.8 ! christos 18: __RCSID("$NetBSD: s_ceilf.c,v 1.7 2002/05/26 22:01:54 wiz Exp $");
1.1 jtc 19: #endif
20:
21: #include "math.h"
22: #include "math_private.h"
23:
24: static const float huge = 1.0e30;
25:
1.7 wiz 26: float
27: ceilf(float x)
1.1 jtc 28: {
1.8 ! christos 29: int32_t i0,jj0;
1.2 jtc 30: u_int32_t i;
31:
1.1 jtc 32: GET_FLOAT_WORD(i0,x);
1.8 ! christos 33: jj0 = ((i0>>23)&0xff)-0x7f;
! 34: if(jj0<23) {
! 35: if(jj0<0) { /* raise inexact if x != 0 */
1.1 jtc 36: if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
1.6 simonb 37: if(i0<0) {i0=0x80000000;}
1.1 jtc 38: else if(i0!=0) { i0=0x3f800000;}
39: }
40: } else {
1.8 ! christos 41: i = (0x007fffff)>>jj0;
1.1 jtc 42: if((i0&i)==0) return x; /* x is integral */
43: if(huge+x>(float)0.0) { /* raise inexact flag */
1.8 ! christos 44: if(i0>0) i0 += (0x00800000)>>jj0;
1.1 jtc 45: i0 &= (~i);
46: }
47: }
48: } else {
1.8 ! christos 49: if(jj0==0x80) return x+x; /* inf or NaN */
1.1 jtc 50: else return x; /* x is integral */
51: }
52: SET_FLOAT_WORD(x,i0);
53: return x;
54: }
CVSweb <webmaster@jp.NetBSD.org>