13a8617a8SJordan K. Hubbard /* s_ceilf.c -- float version of s_ceil.c. 23a8617a8SJordan K. Hubbard * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 33a8617a8SJordan K. Hubbard */ 43a8617a8SJordan K. Hubbard 53a8617a8SJordan K. Hubbard /* 63a8617a8SJordan K. Hubbard * ==================================================== 73a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 83a8617a8SJordan K. Hubbard * 93a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 103a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 113a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 123a8617a8SJordan K. Hubbard * is preserved. 133a8617a8SJordan K. Hubbard * ==================================================== 143a8617a8SJordan K. Hubbard */ 153a8617a8SJordan K. Hubbard 163a8617a8SJordan K. Hubbard #ifndef lint 173a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: s_ceilf.c,v 1.2 1994/08/18 23:06:30 jtc Exp $"; 183a8617a8SJordan K. Hubbard #endif 193a8617a8SJordan K. Hubbard 203a8617a8SJordan K. Hubbard #include "math.h" 213a8617a8SJordan K. Hubbard #include "math_private.h" 223a8617a8SJordan K. Hubbard 233a8617a8SJordan K. Hubbard #ifdef __STDC__ 243a8617a8SJordan K. Hubbard static const float huge = 1.0e30; 253a8617a8SJordan K. Hubbard #else 263a8617a8SJordan K. Hubbard static float huge = 1.0e30; 273a8617a8SJordan K. Hubbard #endif 283a8617a8SJordan K. Hubbard 293a8617a8SJordan K. Hubbard #ifdef __STDC__ 303a8617a8SJordan K. Hubbard float ceilf(float x) 313a8617a8SJordan K. Hubbard #else 323a8617a8SJordan K. Hubbard float ceilf(x) 333a8617a8SJordan K. Hubbard float x; 343a8617a8SJordan K. Hubbard #endif 353a8617a8SJordan K. Hubbard { 363a8617a8SJordan K. Hubbard int32_t i0,j0; 373a8617a8SJordan K. Hubbard u_int32_t i; 383a8617a8SJordan K. Hubbard 393a8617a8SJordan K. Hubbard GET_FLOAT_WORD(i0,x); 403a8617a8SJordan K. Hubbard j0 = ((i0>>23)&0xff)-0x7f; 413a8617a8SJordan K. Hubbard if(j0<23) { 423a8617a8SJordan K. Hubbard if(j0<0) { /* raise inexact if x != 0 */ 433a8617a8SJordan K. Hubbard if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */ 443a8617a8SJordan K. Hubbard if(i0<0) {i0=0x80000000;} 453a8617a8SJordan K. Hubbard else if(i0!=0) { i0=0x3f800000;} 463a8617a8SJordan K. Hubbard } 473a8617a8SJordan K. Hubbard } else { 483a8617a8SJordan K. Hubbard i = (0x007fffff)>>j0; 493a8617a8SJordan K. Hubbard if((i0&i)==0) return x; /* x is integral */ 503a8617a8SJordan K. Hubbard if(huge+x>(float)0.0) { /* raise inexact flag */ 513a8617a8SJordan K. Hubbard if(i0>0) i0 += (0x00800000)>>j0; 523a8617a8SJordan K. Hubbard i0 &= (~i); 533a8617a8SJordan K. Hubbard } 543a8617a8SJordan K. Hubbard } 553a8617a8SJordan K. Hubbard } else { 563a8617a8SJordan K. Hubbard if(j0==0x80) return x+x; /* inf or NaN */ 573a8617a8SJordan K. Hubbard else return x; /* x is integral */ 583a8617a8SJordan K. Hubbard } 593a8617a8SJordan K. Hubbard SET_FLOAT_WORD(x,i0); 603a8617a8SJordan K. Hubbard return x; 613a8617a8SJordan K. Hubbard } 62