doxygen: add newline after \file
[blender.git] / source / blender / blenlib / intern / math_base.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  *
19  * The Original Code is: some of this file.
20  *
21  * */
22
23 /** \file
24  * \ingroup bli
25  */
26
27 #include "BLI_math.h"
28
29 #include "BLI_strict_flags.h"
30
31 int pow_i(int base, int exp)
32 {
33         int result = 1;
34         BLI_assert(exp >= 0);
35         while (exp) {
36                 if (exp & 1) {
37                         result *= base;
38                 }
39                 exp >>= 1;
40                 base *= base;
41         }
42
43         return result;
44 }
45
46 /* from python 3.1 floatobject.c
47  * ndigits must be between 0 and 21 */
48 double double_round(double x, int ndigits)
49 {
50         double pow1, pow2, y, z;
51         if (ndigits >= 0) {
52                 pow1 = pow(10.0, (double)ndigits);
53                 pow2 = 1.0;
54                 y = (x * pow1) * pow2;
55                 /* if y overflows, then rounded value is exactly x */
56                 if (!isfinite(y))
57                         return x;
58         }
59         else {
60                 pow1 = pow(10.0, (double)-ndigits);
61                 pow2 = 1.0; /* unused; silences a gcc compiler warning */
62                 y = x / pow1;
63         }
64
65         z = round(y);
66         if (fabs(y - z) == 0.5)
67                 /* halfway between two integers; use round-half-even */
68                 z = 2.0 * round(y / 2.0);
69
70         if (ndigits >= 0)
71                 z = (z / pow2) / pow1;
72         else
73                 z *= pow1;
74
75         /* if computation resulted in overflow, raise OverflowError */
76         return z;
77 }