Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* Round float to integer away from zero.
  2.    Copyright (C) 1997 Free Software Foundation, Inc.
  3.    This file is part of the GNU C Library.
  4.    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
  5.  
  6.    The GNU C Library is free software; you can redistribute it and/or
  7.    modify it under the terms of the GNU Lesser General Public
  8.    License as published by the Free Software Foundation; either
  9.    version 2.1 of the License, or (at your option) any later version.
  10.  
  11.    The GNU C Library is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.    Lesser General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU Lesser General Public
  17.    License along with the GNU C Library; if not, write to the Free
  18.    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  19.    02111-1307 USA.  */
  20.  
  21. #include <math.h>
  22. #include "fdlibm.h"
  23.  
  24.  
  25. static const float huge = 1.0e30;
  26.  
  27.  
  28. float roundf (float x)
  29. {
  30.   int i0, j0;
  31.  
  32.   GET_FLOAT_WORD (i0, x);
  33.   j0 = ((i0 >> 23) & 0xff) - 0x7f;
  34.   if (j0 < 23)
  35.     {
  36.       if (j0 < 0)
  37.         {
  38.           if (huge + x > 0.0F)
  39.             {
  40.               i0 &= 0x80000000;
  41.               if (j0 == -1)
  42.                 i0 |= 0x3f800000;
  43.             }
  44.         }
  45.       else
  46.         {
  47.           unsigned int i = 0x007fffff >> j0;
  48.           if ((i0 & i) == 0)
  49.             /* X is integral.  */
  50.             return x;
  51.           if (huge + x > 0.0F)
  52.             {
  53.               /* Raise inexact if x != 0.  */
  54.               i0 += 0x00400000 >> j0;
  55.               i0 &= ~i;
  56.             }
  57.         }
  58.     }
  59.   else
  60.     {
  61.       if (j0 == 0x80)
  62.         /* Inf or NaN.  */
  63.         return x + x;
  64.       else
  65.         return x;
  66.     }
  67.  
  68.   SET_FLOAT_WORD (x, i0);
  69.   return x;
  70. }
  71.