s_truncf.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. #include "cdefs-compat.h"
  13. //__FBSDID("$FreeBSD: src/lib/msun/src/s_truncf.c,v 1.1 2004/06/20 09:25:43 das Exp $");
  14. /*
  15. * truncf(x)
  16. * Return x rounded toward 0 to integral value
  17. * Method:
  18. * Bit twiddling.
  19. * Exception:
  20. * Inexact flag raised if x not equal to truncf(x).
  21. */
  22. #include "openlibm.h"
  23. #include "math_private.h"
  24. static const float huge = 1.0e30F;
  25. DLLEXPORT float
  26. truncf(float x)
  27. {
  28. int32_t i0,j0;
  29. u_int32_t i;
  30. GET_FLOAT_WORD(i0,x);
  31. j0 = ((i0>>23)&0xff)-0x7f;
  32. if(j0<23) {
  33. if(j0<0) { /* raise inexact if x != 0 */
  34. if(huge+x>0.0F) /* |x|<1, so return 0*sign(x) */
  35. i0 &= 0x80000000;
  36. } else {
  37. i = (0x007fffff)>>j0;
  38. if((i0&i)==0) return x; /* x is integral */
  39. if(huge+x>0.0F) /* raise inexact flag */
  40. i0 &= (~i);
  41. }
  42. } else {
  43. if(j0==0x80) return x+x; /* inf or NaN */
  44. else return x; /* x is integral */
  45. }
  46. SET_FLOAT_WORD(x,i0);
  47. return x;
  48. }