Annotation of src/lib/libm/src/s_ceilf.c, Revision 1.3
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
11: * software is freely granted, provided that this notice
12: * is preserved.
13: * ====================================================
14: */
15:
1.3 ! jtc 16: #if defined(LIBM_SCCS) && !defined(lint)
! 17: static char rcsid[] = "$Id: s_ceilf.c,v 1.2 1994/08/18 23:06:30 jtc Exp $";
1.1 jtc 18: #endif
19:
20: #include "math.h"
21: #include "math_private.h"
22:
23: #ifdef __STDC__
24: static const float huge = 1.0e30;
25: #else
26: static float huge = 1.0e30;
27: #endif
28:
29: #ifdef __STDC__
30: float ceilf(float x)
31: #else
32: float ceilf(x)
33: float x;
34: #endif
35: {
1.2 jtc 36: int32_t i0,j0;
37: u_int32_t i;
38:
1.1 jtc 39: GET_FLOAT_WORD(i0,x);
40: j0 = ((i0>>23)&0xff)-0x7f;
41: if(j0<23) {
42: if(j0<0) { /* raise inexact if x != 0 */
43: if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
44: if(i0<0) {i0=0x80000000;}
45: else if(i0!=0) { i0=0x3f800000;}
46: }
47: } else {
48: i = (0x007fffff)>>j0;
49: if((i0&i)==0) return x; /* x is integral */
50: if(huge+x>(float)0.0) { /* raise inexact flag */
51: if(i0>0) i0 += (0x00800000)>>j0;
52: i0 &= (~i);
53: }
54: }
55: } else {
56: if(j0==0x80) return x+x; /* inf or NaN */
57: else return x; /* x is integral */
58: }
59: SET_FLOAT_WORD(x,i0);
60: return x;
61: }
CVSweb <webmaster@jp.NetBSD.org>