Update copyright notices with scripts/update-copyrights
[jlayton/glibc.git] / sysdeps / powerpc / fpu / k_cosf.c
1 /* k_cosf.c -- float version of k_cos.c
2    Copyright (C) 2011-2014 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Adhemerval Zanella <azanella@br.ibm.com>, 2011
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Library General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    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    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public
17    License along with the GNU C Library; see the file COPYING.LIB.  If
18    not, see <http://www.gnu.org/licenses/>.  */
19
20 #include <math.h>
21 #include <fenv.h>
22 #include <math_private.h>
23
24 static const float twom27   = 7.4505806e-09;
25 static const float dot3     = 3.0000001e-01;
26 static const float dot78125 = 7.8125000e-01;
27
28 static const float one =  1.0000000000e+00;
29 static const float C1  =  4.1666667908e-02;
30 static const float C2  = -1.3888889225e-03;
31 static const float C3  =  2.4801587642e-05;
32 static const float C4  = -2.7557314297e-07;
33 static const float C5  =  2.0875723372e-09;
34 static const float C6  = -1.1359647598e-11;
35
36 float
37 __kernel_cosf (float x, float y)
38 {
39   float a, hz, z, r, qx;
40   float ix;
41   ix = __builtin_fabsf (x);
42   if (ix < twom27)
43     {                           /* |x| < 2**-27 */
44       __feraiseexcept (FE_INEXACT);
45       return one;
46     }
47   z = x * x;
48   r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6)))));
49   if (ix < dot3)                /* if |x| < 0.3 */
50     return one - ((float) 0.5 * z - (z * r - x * y));
51   else
52     {
53       if (ix > dot78125)
54         {                       /* x > 0.78125 */
55           qx = (float) 0.28125;
56         }
57       else
58         {
59           qx = ix / 4.0;
60         }
61       hz = (float) 0.5 *z - qx;
62       a = one - qx;
63       return a - (hz - (z * r - x * y));
64     }
65 }