Fixed some bugs after merge;
[ZeXOS.git] / libm / cos.c
blobc5f4a41132682a4f8daab8c1b112a74fde30e431
1 /*
2 * ZeX/OS
3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program 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
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 * Thanks for Oroborus
23 #include <math.h>
24 #include <stdlib.h>
26 static double fact (double x)
28 if (x == 0.0)
29 return 1.0;
31 return x * fact (x - 1.0);
34 static double expo (double x, int a)
36 double ret;
37 int i;
39 ret = 1.0;
41 for (i = 0 ; i < abs (a); i ++)
42 ret *= x;
44 return (a > 0 ? ret : 1 / ret);
47 double cos (double x)
49 double ret;
50 int i;
52 ret = 0.0;
54 while (x < 0)
55 x += 2 * M_PI;
57 while (x > 2 * M_PI)
58 x -= 2 * M_PI;
60 for (i = 0 ; i < 16; i ++)
61 ret += (expo (-1, i) * expo (x, 2 * i)) / fact (2 * i);
63 return ret;