~ubuntu-branches/ubuntu/precise/eglibc/precise-201308281639

1 by Aurelien Jarno
Import upstream version 2.9
1
/* Round float to integer away from zero.
288.1.12 by Matthias Klose
Merge from Debian (r5151, 2.13-26).
2
   Copyright (C) 1997, 2011 Free Software Foundation, Inc.
1 by Aurelien Jarno
Import upstream version 2.9
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
1.5.3 by Matthias Klose
Import upstream version 2.15~pre6
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.  */
1 by Aurelien Jarno
Import upstream version 2.9
20
21
#include <math.h>
22
1.5.3 by Matthias Klose
Import upstream version 2.15~pre6
23
#include "math_private.h"
1 by Aurelien Jarno
Import upstream version 2.9
24
25
26
static const float huge = 1.0e30;
27
28
29
float
30
__roundf (float x)
31
{
32
  int32_t i0, j0;
33
34
  GET_FLOAT_WORD (i0, x);
35
  j0 = ((i0 >> 23) & 0xff) - 0x7f;
36
  if (j0 < 23)
37
    {
38
      if (j0 < 0)
39
	{
288.1.12 by Matthias Klose
Merge from Debian (r5151, 2.13-26).
40
	  math_force_eval (huge + x);
41
42
	  i0 &= 0x80000000;
43
	  if (j0 == -1)
44
	    i0 |= 0x3f800000;
1 by Aurelien Jarno
Import upstream version 2.9
45
	}
46
      else
47
	{
48
	  u_int32_t i = 0x007fffff >> j0;
49
	  if ((i0 & i) == 0)
50
	    /* X is integral.  */
51
	    return x;
288.1.12 by Matthias Klose
Merge from Debian (r5151, 2.13-26).
52
	  math_force_eval (huge + x);
53
54
	  /* Raise inexact if x != 0.  */
55
	  i0 += 0x00400000 >> j0;
56
	  i0 &= ~i;
1 by Aurelien Jarno
Import upstream version 2.9
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
weak_alias (__roundf, roundf)