Merge remote-tracking branch 'redux/master' into sh4-pool
[tamarin-stm.git] / platform / symbian / MathUtilsSymbian.cpp
blobeba516b968bbe784bfcb0f0750e985cb8bfb3569
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
14 * The Original Code is [Open Source Virtual Machine.].
16 * The Initial Developer of the Original Code is
17 * Adobe System Incorporated.
18 * Portions created by the Initial Developer are Copyright (C) 2004-2007
19 * the Initial Developer. All Rights Reserved.
21 * Contributor(s):
22 * Adobe AS3 Team
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
36 * ***** END LICENSE BLOCK ***** */
38 #include <e32math.h>
39 #include <math.h> // no Symbian equivalent of frexp, ceil, floor.
41 #include "avmplus.h"
43 namespace avmplus
45 double MathUtils::abs(double value)
47 return ::fabs(value);
50 double MathUtils::acos(double value)
52 double result;
53 Math::ACos(result, value);
54 return result;
57 double MathUtils::asin(double value)
59 double result;
60 Math::ASin(result, value);
61 return result;
64 double MathUtils::atan(double value)
66 double result;
67 Math::ATan(result, value);
68 return result;
71 double MathUtils::atan2(double y, double x)
73 bool xnan = (((int*)(&x))[1] & 0x7FF80000) == 0x7FF80000;
74 bool ynan = (((int*)(&y))[1] & 0x7FF80000) == 0x7FF80000;
76 if (xnan || ynan)
78 return nan();
81 int sx = (((int*)(&x))[1] & 0x80000000);
82 int sy = (((int*)(&y))[1] & 0x80000000);
84 if (y == 0.0)
86 if (sy) // y is -0
88 if (sx) // x is <0 or -0
90 return -KPi;
92 else // x is >0 or +0
94 return -0.0;
97 else // y is +0
99 if (sx) // x is <0 or -0
101 return KPi;
103 else // x is >0 or +0
105 return +0.0;
109 double result;
110 Math::ATan(result, y, x);
111 return result;
114 double MathUtils::ceil(double value)
116 return ::ceil(value);
119 double MathUtils::cos(double value)
121 double result;
122 Math::Cos(result, value);
123 return result;
126 double MathUtils::exp(double value)
128 double result;
129 Math::Exp(result, value);
130 return result;
133 double MathUtils::floor(double value)
135 return ::floor(value);
138 uint64_t MathUtils::frexp(double value, int *eptr)
140 double fracMantissa = ::frexp(value, eptr);
141 // correct mantissa and eptr to get integer values for both
142 *eptr -= 53; // 52 mantissa bits + the hidden bit
143 return (uint64_t)(fracMantissa * (double)(1LL << 53));
146 // The log function wants the natural log, not the base 10 log.
147 double MathUtils::log(double value)
149 double result;
150 Math::Ln(result, value);
151 return result;
154 double fmod(double x, double y)
156 double result;
157 Math::Mod(result, x, y);
158 return result;
161 double MathUtils::mod(double x, double y)
163 double result;
164 Math::Mod(result, x, y);
165 return result;
168 double MathUtils::powInternal(double x, double y)
170 double result;
171 Math::Pow(result, x, y);
172 return result;
175 double MathUtils::sin(double value)
177 double result;
178 Math::Sin(result, value);
179 return result;
182 double MathUtils::sqrt(double value)
184 double result;
185 Math::Sqrt(result, value);
186 return result;
189 double MathUtils::tan(double value)
191 double result;
192 Math::Tan(result, value);
193 return result;