12116Sjkh/* s_ceilf.c -- float version of s_ceil.c. 22116Sjkh * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 32116Sjkh */ 42116Sjkh 52116Sjkh/* 62116Sjkh * ==================================================== 72116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 82116Sjkh * 92116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business. 102116Sjkh * Permission to use, copy, modify, and distribute this 118870Srgrimes * software is freely granted, provided that this notice 122116Sjkh * is preserved. 132116Sjkh * ==================================================== 142116Sjkh */ 152116Sjkh 16176451Sdas#include <sys/cdefs.h> 17176451Sdas__FBSDID("$FreeBSD$"); 182116Sjkh 192116Sjkh#include "math.h" 202116Sjkh#include "math_private.h" 212116Sjkh 222116Sjkhstatic const float huge = 1.0e30; 232116Sjkh 2497413Salfredfloat 2597413Salfredceilf(float x) 262116Sjkh{ 272116Sjkh int32_t i0,j0; 282116Sjkh u_int32_t i; 292116Sjkh 302116Sjkh GET_FLOAT_WORD(i0,x); 312116Sjkh j0 = ((i0>>23)&0xff)-0x7f; 322116Sjkh if(j0<23) { 332116Sjkh if(j0<0) { /* raise inexact if x != 0 */ 342116Sjkh if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */ 358870Srgrimes if(i0<0) {i0=0x80000000;} 362116Sjkh else if(i0!=0) { i0=0x3f800000;} 372116Sjkh } 382116Sjkh } else { 392116Sjkh i = (0x007fffff)>>j0; 402116Sjkh if((i0&i)==0) return x; /* x is integral */ 412116Sjkh if(huge+x>(float)0.0) { /* raise inexact flag */ 422116Sjkh if(i0>0) i0 += (0x00800000)>>j0; 432116Sjkh i0 &= (~i); 442116Sjkh } 452116Sjkh } 462116Sjkh } else { 472116Sjkh if(j0==0x80) return x+x; /* inf or NaN */ 482116Sjkh else return x; /* x is integral */ 492116Sjkh } 502116Sjkh SET_FLOAT_WORD(x,i0); 512116Sjkh return x; 522116Sjkh} 53