xref: /aosp_15_r20/external/deqp/framework/delibs/debase/deMath.h (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _DEMATH_H
2*35238bceSAndroid Build Coastguard Worker #define _DEMATH_H
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Base Portability Library
5*35238bceSAndroid Build Coastguard Worker  * -------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Basic mathematical operations.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deDefs.h"
27*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include <math.h>
30*35238bceSAndroid Build Coastguard Worker #include <float.h>
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker DE_BEGIN_EXTERN_C
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker /* Mathematical constants. */
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #define DE_PI 3.14159265358979324f            /*!< Pi.                    */
37*35238bceSAndroid Build Coastguard Worker #define DE_LOG_2 0.69314718056f               /*!< log_e(2.0)                */
38*35238bceSAndroid Build Coastguard Worker #define DE_INV_LOG_2 1.44269504089f           /*!< 1.0 / log_e(2.0)        */
39*35238bceSAndroid Build Coastguard Worker #define DE_E 2.71828182845904523536f          /*!< e.                        */
40*35238bceSAndroid Build Coastguard Worker #define DE_LOG2_E 1.44269504088896340736f     /*!< log_2(e).                */
41*35238bceSAndroid Build Coastguard Worker #define DE_INV_LOG2_E 0.69314718055994530942f /*!< 1.0 / log_2(e).        */
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker #define DE_PI_DOUBLE 3.14159265358979323846 /*!< Pi as a double.        */
44*35238bceSAndroid Build Coastguard Worker #define DE_PI_16BIT 0x4248                  /*!< Pi. as a float16b        */
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker /* Rounding mode control. */
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker typedef enum deRoundingMode_e
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker     DE_ROUNDINGMODE_TO_NEAREST_EVEN = 0,
51*35238bceSAndroid Build Coastguard Worker     DE_ROUNDINGMODE_TO_ZERO,
52*35238bceSAndroid Build Coastguard Worker     DE_ROUNDINGMODE_TO_POSITIVE_INF,
53*35238bceSAndroid Build Coastguard Worker     DE_ROUNDINGMODE_TO_NEGATIVE_INF,
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker     DE_ROUNDINGMODE_LAST
56*35238bceSAndroid Build Coastguard Worker } deRoundingMode;
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker deRoundingMode deGetRoundingMode(void);
59*35238bceSAndroid Build Coastguard Worker bool deSetRoundingMode(deRoundingMode mode);
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker void deMath_selfTest(void);
62*35238bceSAndroid Build Coastguard Worker 
63*35238bceSAndroid Build Coastguard Worker /* Float properties */
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker /* \note The NaN test probably won't work with -ffast-math */
66*35238bceSAndroid Build Coastguard Worker 
deFloatIsInf(float x)67*35238bceSAndroid Build Coastguard Worker DE_INLINE int deFloatIsInf(float x)
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker     return (x > FLT_MAX) - (x < -FLT_MAX);
70*35238bceSAndroid Build Coastguard Worker }
deFloatIsNaN(float x)71*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deFloatIsNaN(float x)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker     return (x != x);
74*35238bceSAndroid Build Coastguard Worker }
75*35238bceSAndroid Build Coastguard Worker 
deIsInf(double x)76*35238bceSAndroid Build Coastguard Worker DE_INLINE int deIsInf(double x)
77*35238bceSAndroid Build Coastguard Worker {
78*35238bceSAndroid Build Coastguard Worker     return (x > DBL_MAX) - (x < -DBL_MAX);
79*35238bceSAndroid Build Coastguard Worker }
deIsNaN(double x)80*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deIsNaN(double x)
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker     return (x != x);
83*35238bceSAndroid Build Coastguard Worker }
84*35238bceSAndroid Build Coastguard Worker 
deFloatBitsToUint32(float x)85*35238bceSAndroid Build Coastguard Worker DE_INLINE uint32_t deFloatBitsToUint32(float x)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker     uint32_t bits;
88*35238bceSAndroid Build Coastguard Worker     deMemcpy((void *)&bits, (void *)&x, 4);
89*35238bceSAndroid Build Coastguard Worker     return bits;
90*35238bceSAndroid Build Coastguard Worker }
91*35238bceSAndroid Build Coastguard Worker 
deDoubleBitsToUint64(double x)92*35238bceSAndroid Build Coastguard Worker DE_INLINE uint64_t deDoubleBitsToUint64(double x)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker     uint64_t bits;
95*35238bceSAndroid Build Coastguard Worker     deMemcpy((void *)&bits, (void *)&x, 8);
96*35238bceSAndroid Build Coastguard Worker     return bits;
97*35238bceSAndroid Build Coastguard Worker }
98*35238bceSAndroid Build Coastguard Worker 
deFloatIsPositiveZero(float x)99*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deFloatIsPositiveZero(float x)
100*35238bceSAndroid Build Coastguard Worker {
101*35238bceSAndroid Build Coastguard Worker     return x == 0 && (deFloatBitsToUint32(x) >> 31) == 0;
102*35238bceSAndroid Build Coastguard Worker }
103*35238bceSAndroid Build Coastguard Worker 
deDoubleIsPositiveZero(double x)104*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deDoubleIsPositiveZero(double x)
105*35238bceSAndroid Build Coastguard Worker {
106*35238bceSAndroid Build Coastguard Worker     return x == 0 && (deDoubleBitsToUint64(x) >> 63) == 0;
107*35238bceSAndroid Build Coastguard Worker }
108*35238bceSAndroid Build Coastguard Worker 
deFloatIsNegativeZero(float x)109*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deFloatIsNegativeZero(float x)
110*35238bceSAndroid Build Coastguard Worker {
111*35238bceSAndroid Build Coastguard Worker     return x == 0 && (deFloatBitsToUint32(x) >> 31) != 0;
112*35238bceSAndroid Build Coastguard Worker }
113*35238bceSAndroid Build Coastguard Worker 
deDoubleIsNegativeZero(double x)114*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deDoubleIsNegativeZero(double x)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker     return x == 0 && (deDoubleBitsToUint64(x) >> 63) != 0;
117*35238bceSAndroid Build Coastguard Worker }
118*35238bceSAndroid Build Coastguard Worker 
deFloatIsIEEENaN(float x)119*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deFloatIsIEEENaN(float x)
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker     uint32_t e = (deFloatBitsToUint32(x) & 0x7f800000u) >> 23;
122*35238bceSAndroid Build Coastguard Worker     uint32_t m = (deFloatBitsToUint32(x) & 0x007fffffu);
123*35238bceSAndroid Build Coastguard Worker     return e == 0xff && m != 0;
124*35238bceSAndroid Build Coastguard Worker }
125*35238bceSAndroid Build Coastguard Worker 
deDoubleIsIEEENaN(double x)126*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deDoubleIsIEEENaN(double x)
127*35238bceSAndroid Build Coastguard Worker {
128*35238bceSAndroid Build Coastguard Worker     uint64_t e = (deDoubleBitsToUint64(x) & 0x7ff0000000000000ull) >> 52;
129*35238bceSAndroid Build Coastguard Worker     uint64_t m = (deDoubleBitsToUint64(x) & 0x000fffffffffffffull);
130*35238bceSAndroid Build Coastguard Worker     return e == 0x7ff && m != 0;
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker /* \note The definition used for signaling NaN here is valid for ARM and
134*35238bceSAndroid Build Coastguard Worker  * x86 but possibly not for other platforms.
135*35238bceSAndroid Build Coastguard Worker  *
136*35238bceSAndroid Build Coastguard Worker  * These are defined as overloads so that they can be used in templated
137*35238bceSAndroid Build Coastguard Worker  * code without risking a type conversion which would triggern an exception
138*35238bceSAndroid Build Coastguard Worker  * on a signaling NaN.  We don't use deIsNan in these helpers because they
139*35238bceSAndroid Build Coastguard Worker  * do a comparison operation which may also trigger exceptions.
140*35238bceSAndroid Build Coastguard Worker  */
deFloatIsSignalingNaN(float x)141*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deFloatIsSignalingNaN(float x)
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker     return deFloatIsIEEENaN(x) && (deFloatBitsToUint32(x) & (1u << 22)) == 0;
144*35238bceSAndroid Build Coastguard Worker }
145*35238bceSAndroid Build Coastguard Worker 
deDoubleIsSignalingNaN(double x)146*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deDoubleIsSignalingNaN(double x)
147*35238bceSAndroid Build Coastguard Worker {
148*35238bceSAndroid Build Coastguard Worker     return deDoubleIsIEEENaN(x) && (deDoubleBitsToUint64(x) & (1ull << 51)) == 0;
149*35238bceSAndroid Build Coastguard Worker }
150*35238bceSAndroid Build Coastguard Worker 
deFloatIsQuietNaN(float x)151*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deFloatIsQuietNaN(float x)
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker     return deFloatIsIEEENaN(x) && (deFloatBitsToUint32(x) & (1u << 22)) != 0;
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker 
deDoubleIsQuietNaN(double x)156*35238bceSAndroid Build Coastguard Worker DE_INLINE bool deDoubleIsQuietNaN(double x)
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker     return deDoubleIsIEEENaN(x) && (deDoubleBitsToUint64(x) & (1ull << 51)) != 0;
159*35238bceSAndroid Build Coastguard Worker }
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker /* Basic utilities. */
162*35238bceSAndroid Build Coastguard Worker 
deFloatAbs(float x)163*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAbs(float x)
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker     return (x >= 0.0f) ? x : -x;
166*35238bceSAndroid Build Coastguard Worker }
deFloatMin(float a,float b)167*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatMin(float a, float b)
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker     return (a <= b) ? a : b;
170*35238bceSAndroid Build Coastguard Worker }
deFloatMax(float a,float b)171*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatMax(float a, float b)
172*35238bceSAndroid Build Coastguard Worker {
173*35238bceSAndroid Build Coastguard Worker     return (a >= b) ? a : b;
174*35238bceSAndroid Build Coastguard Worker }
deFloatClamp(float x,float mn,float mx)175*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatClamp(float x, float mn, float mx)
176*35238bceSAndroid Build Coastguard Worker {
177*35238bceSAndroid Build Coastguard Worker     return (x <= mn) ? mn : ((x >= mx) ? mx : x);
178*35238bceSAndroid Build Coastguard Worker }
179*35238bceSAndroid Build Coastguard Worker 
deAbs(double x)180*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAbs(double x)
181*35238bceSAndroid Build Coastguard Worker {
182*35238bceSAndroid Build Coastguard Worker     return (x >= 0.0) ? x : -x;
183*35238bceSAndroid Build Coastguard Worker }
deMin(double a,double b)184*35238bceSAndroid Build Coastguard Worker DE_INLINE double deMin(double a, double b)
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker     return (a <= b) ? a : b;
187*35238bceSAndroid Build Coastguard Worker }
deMax(double a,double b)188*35238bceSAndroid Build Coastguard Worker DE_INLINE double deMax(double a, double b)
189*35238bceSAndroid Build Coastguard Worker {
190*35238bceSAndroid Build Coastguard Worker     return (a >= b) ? a : b;
191*35238bceSAndroid Build Coastguard Worker }
deClamp(double x,double mn,double mx)192*35238bceSAndroid Build Coastguard Worker DE_INLINE double deClamp(double x, double mn, double mx)
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker     return (x <= mn) ? mn : ((x >= mx) ? mx : x);
195*35238bceSAndroid Build Coastguard Worker }
196*35238bceSAndroid Build Coastguard Worker 
197*35238bceSAndroid Build Coastguard Worker /* Utility functions. */
198*35238bceSAndroid Build Coastguard Worker 
deFloatSign(float a)199*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatSign(float a)
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker     return (a == 0.0f) ? 0.0f : ((a > 0.0f) ? +1.0f : -1.0f);
202*35238bceSAndroid Build Coastguard Worker }
deFloatIntSign(float a)203*35238bceSAndroid Build Coastguard Worker DE_INLINE int deFloatIntSign(float a)
204*35238bceSAndroid Build Coastguard Worker {
205*35238bceSAndroid Build Coastguard Worker     return (a == 0.0f) ? 0 : ((a > 0.0f) ? +1 : -1);
206*35238bceSAndroid Build Coastguard Worker }
deFloatFloor(float a)207*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatFloor(float a)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker     return (float)floor(a);
210*35238bceSAndroid Build Coastguard Worker }
deFloatCeil(float a)211*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatCeil(float a)
212*35238bceSAndroid Build Coastguard Worker {
213*35238bceSAndroid Build Coastguard Worker     return (float)ceil(a);
214*35238bceSAndroid Build Coastguard Worker }
deFloatRound(float a)215*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatRound(float a)
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker     return deFloatFloor(a + 0.5f);
218*35238bceSAndroid Build Coastguard Worker }
deFloatFrac(float a)219*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatFrac(float a)
220*35238bceSAndroid Build Coastguard Worker {
221*35238bceSAndroid Build Coastguard Worker     return a - deFloatFloor(a);
222*35238bceSAndroid Build Coastguard Worker }
deFloatMod(float a,float b)223*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatMod(float a, float b)
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker     return (float)fmod(a, b);
226*35238bceSAndroid Build Coastguard Worker }
deFloatModf(float x,float * i)227*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatModf(float x, float *i)
228*35238bceSAndroid Build Coastguard Worker {
229*35238bceSAndroid Build Coastguard Worker     double j   = 0;
230*35238bceSAndroid Build Coastguard Worker     double ret = modf(x, &j);
231*35238bceSAndroid Build Coastguard Worker     *i         = (float)j;
232*35238bceSAndroid Build Coastguard Worker     return (float)ret;
233*35238bceSAndroid Build Coastguard Worker }
deFloatMadd(float a,float b,float c)234*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatMadd(float a, float b, float c)
235*35238bceSAndroid Build Coastguard Worker {
236*35238bceSAndroid Build Coastguard Worker     return (a * b) + c;
237*35238bceSAndroid Build Coastguard Worker }
deFloatTrunc(float a)238*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatTrunc(float a)
239*35238bceSAndroid Build Coastguard Worker {
240*35238bceSAndroid Build Coastguard Worker     return deFloatSign(a) * deFloatFloor(deFloatAbs(a));
241*35238bceSAndroid Build Coastguard Worker }
deFloatLdExp(float a,int exponent)242*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatLdExp(float a, int exponent)
243*35238bceSAndroid Build Coastguard Worker {
244*35238bceSAndroid Build Coastguard Worker     return (float)ldexp(a, exponent);
245*35238bceSAndroid Build Coastguard Worker }
deFloatFrExp(float x,int * exponent)246*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatFrExp(float x, int *exponent)
247*35238bceSAndroid Build Coastguard Worker {
248*35238bceSAndroid Build Coastguard Worker     return (float)frexp(x, exponent);
249*35238bceSAndroid Build Coastguard Worker }
250*35238bceSAndroid Build Coastguard Worker float deFloatFractExp(float x, int *exponent);
251*35238bceSAndroid Build Coastguard Worker 
deSign(double x)252*35238bceSAndroid Build Coastguard Worker DE_INLINE double deSign(double x)
253*35238bceSAndroid Build Coastguard Worker {
254*35238bceSAndroid Build Coastguard Worker     return deDoubleIsIEEENaN(x) ? x : (double)((x > 0.0) - (x < 0.0));
255*35238bceSAndroid Build Coastguard Worker }
deIntSign(double x)256*35238bceSAndroid Build Coastguard Worker DE_INLINE int deIntSign(double x)
257*35238bceSAndroid Build Coastguard Worker {
258*35238bceSAndroid Build Coastguard Worker     return (x > 0.0) - (x < 0.0);
259*35238bceSAndroid Build Coastguard Worker }
deFloor(double a)260*35238bceSAndroid Build Coastguard Worker DE_INLINE double deFloor(double a)
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker     return floor(a);
263*35238bceSAndroid Build Coastguard Worker }
deCeil(double a)264*35238bceSAndroid Build Coastguard Worker DE_INLINE double deCeil(double a)
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker     return ceil(a);
267*35238bceSAndroid Build Coastguard Worker }
deRound(double a)268*35238bceSAndroid Build Coastguard Worker DE_INLINE double deRound(double a)
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker     return floor(a + 0.5);
271*35238bceSAndroid Build Coastguard Worker }
deFrac(double a)272*35238bceSAndroid Build Coastguard Worker DE_INLINE double deFrac(double a)
273*35238bceSAndroid Build Coastguard Worker {
274*35238bceSAndroid Build Coastguard Worker     return a - deFloor(a);
275*35238bceSAndroid Build Coastguard Worker }
deMod(double a,double b)276*35238bceSAndroid Build Coastguard Worker DE_INLINE double deMod(double a, double b)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker     return fmod(a, b);
279*35238bceSAndroid Build Coastguard Worker }
deModf(double x,double * i)280*35238bceSAndroid Build Coastguard Worker DE_INLINE double deModf(double x, double *i)
281*35238bceSAndroid Build Coastguard Worker {
282*35238bceSAndroid Build Coastguard Worker     return modf(x, i);
283*35238bceSAndroid Build Coastguard Worker }
deMadd(double a,double b,double c)284*35238bceSAndroid Build Coastguard Worker DE_INLINE double deMadd(double a, double b, double c)
285*35238bceSAndroid Build Coastguard Worker {
286*35238bceSAndroid Build Coastguard Worker     return (a * b) + c;
287*35238bceSAndroid Build Coastguard Worker }
deTrunc(double a)288*35238bceSAndroid Build Coastguard Worker DE_INLINE double deTrunc(double a)
289*35238bceSAndroid Build Coastguard Worker {
290*35238bceSAndroid Build Coastguard Worker     return deSign(a) * floor(fabs(a));
291*35238bceSAndroid Build Coastguard Worker }
deLdExp(double a,int exponent)292*35238bceSAndroid Build Coastguard Worker DE_INLINE double deLdExp(double a, int exponent)
293*35238bceSAndroid Build Coastguard Worker {
294*35238bceSAndroid Build Coastguard Worker     return ldexp(a, exponent);
295*35238bceSAndroid Build Coastguard Worker }
296*35238bceSAndroid Build Coastguard Worker double deRoundEven(double a);
deFrExp(double x,int * exponent)297*35238bceSAndroid Build Coastguard Worker DE_INLINE double deFrExp(double x, int *exponent)
298*35238bceSAndroid Build Coastguard Worker {
299*35238bceSAndroid Build Coastguard Worker     return frexp(x, exponent);
300*35238bceSAndroid Build Coastguard Worker }
301*35238bceSAndroid Build Coastguard Worker /* Like frexp, except the returned fraction is in range [1.0, 2.0) */
302*35238bceSAndroid Build Coastguard Worker double deFractExp(double x, int *exponent);
303*35238bceSAndroid Build Coastguard Worker 
304*35238bceSAndroid Build Coastguard Worker /* Exponential functions. */
305*35238bceSAndroid Build Coastguard Worker 
deFloatPow(float a,float b)306*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatPow(float a, float b)
307*35238bceSAndroid Build Coastguard Worker {
308*35238bceSAndroid Build Coastguard Worker     return (float)pow(a, b);
309*35238bceSAndroid Build Coastguard Worker }
deFloatExp(float a)310*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatExp(float a)
311*35238bceSAndroid Build Coastguard Worker {
312*35238bceSAndroid Build Coastguard Worker     return (float)exp(a);
313*35238bceSAndroid Build Coastguard Worker }
deFloatLog(float a)314*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatLog(float a)
315*35238bceSAndroid Build Coastguard Worker {
316*35238bceSAndroid Build Coastguard Worker     return (float)log(a);
317*35238bceSAndroid Build Coastguard Worker }
deFloatExp2(float a)318*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatExp2(float a)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker     return (float)exp(a * DE_LOG_2);
321*35238bceSAndroid Build Coastguard Worker }
deFloatLog2(float a)322*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatLog2(float a)
323*35238bceSAndroid Build Coastguard Worker {
324*35238bceSAndroid Build Coastguard Worker     return (float)log(a) * DE_INV_LOG_2;
325*35238bceSAndroid Build Coastguard Worker }
deFloatSqrt(float a)326*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatSqrt(float a)
327*35238bceSAndroid Build Coastguard Worker {
328*35238bceSAndroid Build Coastguard Worker     return (float)sqrt(a);
329*35238bceSAndroid Build Coastguard Worker }
deFloatRcp(float a)330*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatRcp(float a)
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker     return (1.0f / a);
333*35238bceSAndroid Build Coastguard Worker }
deFloatRsq(float a)334*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatRsq(float a)
335*35238bceSAndroid Build Coastguard Worker {
336*35238bceSAndroid Build Coastguard Worker     float s = (float)sqrt(a);
337*35238bceSAndroid Build Coastguard Worker     return (s == 0.0f) ? 0.0f : (1.0f / s);
338*35238bceSAndroid Build Coastguard Worker }
339*35238bceSAndroid Build Coastguard Worker 
dePow(double a,double b)340*35238bceSAndroid Build Coastguard Worker DE_INLINE double dePow(double a, double b)
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker     return pow(a, b);
343*35238bceSAndroid Build Coastguard Worker }
deExp(double a)344*35238bceSAndroid Build Coastguard Worker DE_INLINE double deExp(double a)
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker     return exp(a);
347*35238bceSAndroid Build Coastguard Worker }
deLog(double a)348*35238bceSAndroid Build Coastguard Worker DE_INLINE double deLog(double a)
349*35238bceSAndroid Build Coastguard Worker {
350*35238bceSAndroid Build Coastguard Worker     return log(a);
351*35238bceSAndroid Build Coastguard Worker }
deExp2(double a)352*35238bceSAndroid Build Coastguard Worker DE_INLINE double deExp2(double a)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker     return exp(a * log(2.0));
355*35238bceSAndroid Build Coastguard Worker }
deLog2(double a)356*35238bceSAndroid Build Coastguard Worker DE_INLINE double deLog2(double a)
357*35238bceSAndroid Build Coastguard Worker {
358*35238bceSAndroid Build Coastguard Worker     return log(a) / log(2.0);
359*35238bceSAndroid Build Coastguard Worker }
deSqrt(double a)360*35238bceSAndroid Build Coastguard Worker DE_INLINE double deSqrt(double a)
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker     return sqrt(a);
363*35238bceSAndroid Build Coastguard Worker }
deCbrt(double a)364*35238bceSAndroid Build Coastguard Worker DE_INLINE double deCbrt(double a)
365*35238bceSAndroid Build Coastguard Worker {
366*35238bceSAndroid Build Coastguard Worker     return deSign(a) * dePow(deAbs(a), 1.0 / 3.0);
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker 
369*35238bceSAndroid Build Coastguard Worker /* Geometric functions. */
370*35238bceSAndroid Build Coastguard Worker 
deFloatRadians(float a)371*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatRadians(float a)
372*35238bceSAndroid Build Coastguard Worker {
373*35238bceSAndroid Build Coastguard Worker     return a * (DE_PI / 180.0f);
374*35238bceSAndroid Build Coastguard Worker }
deFloatDegrees(float a)375*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatDegrees(float a)
376*35238bceSAndroid Build Coastguard Worker {
377*35238bceSAndroid Build Coastguard Worker     return a * (180.0f / DE_PI);
378*35238bceSAndroid Build Coastguard Worker }
deFloatSin(float a)379*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatSin(float a)
380*35238bceSAndroid Build Coastguard Worker {
381*35238bceSAndroid Build Coastguard Worker     return (float)sin(a);
382*35238bceSAndroid Build Coastguard Worker }
deFloatCos(float a)383*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatCos(float a)
384*35238bceSAndroid Build Coastguard Worker {
385*35238bceSAndroid Build Coastguard Worker     return (float)cos(a);
386*35238bceSAndroid Build Coastguard Worker }
deFloatTan(float a)387*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatTan(float a)
388*35238bceSAndroid Build Coastguard Worker {
389*35238bceSAndroid Build Coastguard Worker     return (float)tan(a);
390*35238bceSAndroid Build Coastguard Worker }
deFloatAsin(float a)391*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAsin(float a)
392*35238bceSAndroid Build Coastguard Worker {
393*35238bceSAndroid Build Coastguard Worker     return (float)asin(a);
394*35238bceSAndroid Build Coastguard Worker }
deFloatAcos(float a)395*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAcos(float a)
396*35238bceSAndroid Build Coastguard Worker {
397*35238bceSAndroid Build Coastguard Worker     return (float)acos(a);
398*35238bceSAndroid Build Coastguard Worker }
deFloatAtan2(float y,float x)399*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAtan2(float y, float x)
400*35238bceSAndroid Build Coastguard Worker {
401*35238bceSAndroid Build Coastguard Worker     return (float)atan2(y, x);
402*35238bceSAndroid Build Coastguard Worker }
deFloatAtanOver(float yOverX)403*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAtanOver(float yOverX)
404*35238bceSAndroid Build Coastguard Worker {
405*35238bceSAndroid Build Coastguard Worker     return (float)atan(yOverX);
406*35238bceSAndroid Build Coastguard Worker }
deFloatSinh(float a)407*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatSinh(float a)
408*35238bceSAndroid Build Coastguard Worker {
409*35238bceSAndroid Build Coastguard Worker     return (float)sinh(a);
410*35238bceSAndroid Build Coastguard Worker }
deFloatCosh(float a)411*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatCosh(float a)
412*35238bceSAndroid Build Coastguard Worker {
413*35238bceSAndroid Build Coastguard Worker     return (float)cosh(a);
414*35238bceSAndroid Build Coastguard Worker }
deFloatTanh(float a)415*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatTanh(float a)
416*35238bceSAndroid Build Coastguard Worker {
417*35238bceSAndroid Build Coastguard Worker     return (float)tanh(a);
418*35238bceSAndroid Build Coastguard Worker }
deFloatAsinh(float a)419*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAsinh(float a)
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker     return deFloatLog(a + deFloatSqrt(a * a + 1));
422*35238bceSAndroid Build Coastguard Worker }
deFloatAcosh(float a)423*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAcosh(float a)
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker     return deFloatLog(a + deFloatSqrt(a * a - 1));
426*35238bceSAndroid Build Coastguard Worker }
deFloatAtanh(float a)427*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatAtanh(float a)
428*35238bceSAndroid Build Coastguard Worker {
429*35238bceSAndroid Build Coastguard Worker     return 0.5f * deFloatLog((1.0f + a) / (1.0f - a));
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker 
deSin(double a)432*35238bceSAndroid Build Coastguard Worker DE_INLINE double deSin(double a)
433*35238bceSAndroid Build Coastguard Worker {
434*35238bceSAndroid Build Coastguard Worker     return sin(a);
435*35238bceSAndroid Build Coastguard Worker }
deCos(double a)436*35238bceSAndroid Build Coastguard Worker DE_INLINE double deCos(double a)
437*35238bceSAndroid Build Coastguard Worker {
438*35238bceSAndroid Build Coastguard Worker     return cos(a);
439*35238bceSAndroid Build Coastguard Worker }
deTan(double a)440*35238bceSAndroid Build Coastguard Worker DE_INLINE double deTan(double a)
441*35238bceSAndroid Build Coastguard Worker {
442*35238bceSAndroid Build Coastguard Worker     return tan(a);
443*35238bceSAndroid Build Coastguard Worker }
deAsin(double a)444*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAsin(double a)
445*35238bceSAndroid Build Coastguard Worker {
446*35238bceSAndroid Build Coastguard Worker     return asin(a);
447*35238bceSAndroid Build Coastguard Worker }
deAcos(double a)448*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAcos(double a)
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker     return acos(a);
451*35238bceSAndroid Build Coastguard Worker }
deAtan2(double y,double x)452*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAtan2(double y, double x)
453*35238bceSAndroid Build Coastguard Worker {
454*35238bceSAndroid Build Coastguard Worker     return atan2(y, x);
455*35238bceSAndroid Build Coastguard Worker }
deAtanOver(double yOverX)456*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAtanOver(double yOverX)
457*35238bceSAndroid Build Coastguard Worker {
458*35238bceSAndroid Build Coastguard Worker     return atan(yOverX);
459*35238bceSAndroid Build Coastguard Worker }
deSinh(double a)460*35238bceSAndroid Build Coastguard Worker DE_INLINE double deSinh(double a)
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker     return sinh(a);
463*35238bceSAndroid Build Coastguard Worker }
deCosh(double a)464*35238bceSAndroid Build Coastguard Worker DE_INLINE double deCosh(double a)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker     return cosh(a);
467*35238bceSAndroid Build Coastguard Worker }
deTanh(double a)468*35238bceSAndroid Build Coastguard Worker DE_INLINE double deTanh(double a)
469*35238bceSAndroid Build Coastguard Worker {
470*35238bceSAndroid Build Coastguard Worker     return tanh(a);
471*35238bceSAndroid Build Coastguard Worker }
deAsinh(double a)472*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAsinh(double a)
473*35238bceSAndroid Build Coastguard Worker {
474*35238bceSAndroid Build Coastguard Worker     return deLog(a + deSqrt(a * a + 1));
475*35238bceSAndroid Build Coastguard Worker }
deAcosh(double a)476*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAcosh(double a)
477*35238bceSAndroid Build Coastguard Worker {
478*35238bceSAndroid Build Coastguard Worker     return deLog(a + deSqrt(a * a - 1));
479*35238bceSAndroid Build Coastguard Worker }
deAtanh(double a)480*35238bceSAndroid Build Coastguard Worker DE_INLINE double deAtanh(double a)
481*35238bceSAndroid Build Coastguard Worker {
482*35238bceSAndroid Build Coastguard Worker     return 0.5 * deLog((1.0 + a) / (1.0 - a));
483*35238bceSAndroid Build Coastguard Worker }
484*35238bceSAndroid Build Coastguard Worker 
485*35238bceSAndroid Build Coastguard Worker /* Interpolation. */
486*35238bceSAndroid Build Coastguard Worker 
deFloatMix(float a,float b,float t)487*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatMix(float a, float b, float t)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker     return a * (1.0f - t) + b * t;
490*35238bceSAndroid Build Coastguard Worker }
deFloatStep(float limit,float val)491*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatStep(float limit, float val)
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker     return (val < limit) ? 0.0f : 1.0f;
494*35238bceSAndroid Build Coastguard Worker }
deFloatSmoothStep(float e0,float e1,float v)495*35238bceSAndroid Build Coastguard Worker DE_INLINE float deFloatSmoothStep(float e0, float e1, float v)
496*35238bceSAndroid Build Coastguard Worker {
497*35238bceSAndroid Build Coastguard Worker     float t;
498*35238bceSAndroid Build Coastguard Worker     if (v <= e0)
499*35238bceSAndroid Build Coastguard Worker         return 0.0f;
500*35238bceSAndroid Build Coastguard Worker     if (v >= e1)
501*35238bceSAndroid Build Coastguard Worker         return 1.0f;
502*35238bceSAndroid Build Coastguard Worker     t = (v - e0) / (e1 - e0);
503*35238bceSAndroid Build Coastguard Worker     return t * t * (3.0f - 2.0f * t);
504*35238bceSAndroid Build Coastguard Worker }
505*35238bceSAndroid Build Coastguard Worker 
deMix(double a,double b,double t)506*35238bceSAndroid Build Coastguard Worker DE_INLINE double deMix(double a, double b, double t)
507*35238bceSAndroid Build Coastguard Worker {
508*35238bceSAndroid Build Coastguard Worker     return a * (1.0 - t) + b * t;
509*35238bceSAndroid Build Coastguard Worker }
deStep(double limit,double val)510*35238bceSAndroid Build Coastguard Worker DE_INLINE double deStep(double limit, double val)
511*35238bceSAndroid Build Coastguard Worker {
512*35238bceSAndroid Build Coastguard Worker     return (val < limit) ? 0.0 : 1.0;
513*35238bceSAndroid Build Coastguard Worker }
514*35238bceSAndroid Build Coastguard Worker 
515*35238bceSAndroid Build Coastguard Worker /* Convert int to float. If the value cannot be represented exactly in native single precision format, return
516*35238bceSAndroid Build Coastguard Worker  * either the nearest lower or the nearest higher representable value, chosen in an implementation-defined manner.
517*35238bceSAndroid Build Coastguard Worker  *
518*35238bceSAndroid Build Coastguard Worker  * \note Choosing either nearest lower or nearest higher means that implementation could for example consistently
519*35238bceSAndroid Build Coastguard Worker  *       choose the lower value, i.e. this function does not round towards nearest.
520*35238bceSAndroid Build Coastguard Worker  * \note Value returned is in native single precision format. For example with x86 extended precision, the value
521*35238bceSAndroid Build Coastguard Worker  *       returned might not be representable in IEEE single precision float.
522*35238bceSAndroid Build Coastguard Worker  */
deInt32ToFloat(int32_t x)523*35238bceSAndroid Build Coastguard Worker DE_INLINE float deInt32ToFloat(int32_t x)
524*35238bceSAndroid Build Coastguard Worker {
525*35238bceSAndroid Build Coastguard Worker     return (float)x;
526*35238bceSAndroid Build Coastguard Worker }
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker /* Convert to float. If the value cannot be represented exactly in IEEE single precision floating point format,
529*35238bceSAndroid Build Coastguard Worker  * return the nearest lower (round towards negative inf). */
530*35238bceSAndroid Build Coastguard Worker float deInt32ToFloatRoundToNegInf(int32_t x);
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker /* Convert to float. If the value cannot be represented exactly IEEE single precision floating point format,
533*35238bceSAndroid Build Coastguard Worker  * return the nearest higher (round towards positive inf). */
534*35238bceSAndroid Build Coastguard Worker float deInt32ToFloatRoundToPosInf(int32_t x);
535*35238bceSAndroid Build Coastguard Worker 
536*35238bceSAndroid Build Coastguard Worker /* Conversion to integer. */
537*35238bceSAndroid Build Coastguard Worker 
deChopFloatToInt32(float x)538*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deChopFloatToInt32(float x)
539*35238bceSAndroid Build Coastguard Worker {
540*35238bceSAndroid Build Coastguard Worker     return (int32_t)x;
541*35238bceSAndroid Build Coastguard Worker }
deFloorFloatToInt32(float x)542*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deFloorFloatToInt32(float x)
543*35238bceSAndroid Build Coastguard Worker {
544*35238bceSAndroid Build Coastguard Worker     return (int32_t)(deFloatFloor(x));
545*35238bceSAndroid Build Coastguard Worker }
deCeilFloatToInt32(float x)546*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deCeilFloatToInt32(float x)
547*35238bceSAndroid Build Coastguard Worker {
548*35238bceSAndroid Build Coastguard Worker     return (int32_t)(deFloatCeil(x));
549*35238bceSAndroid Build Coastguard Worker }
550*35238bceSAndroid Build Coastguard Worker 
deChopToInt32(double x)551*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deChopToInt32(double x)
552*35238bceSAndroid Build Coastguard Worker {
553*35238bceSAndroid Build Coastguard Worker     return (int32_t)x;
554*35238bceSAndroid Build Coastguard Worker }
deFloorToInt32(double x)555*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deFloorToInt32(double x)
556*35238bceSAndroid Build Coastguard Worker {
557*35238bceSAndroid Build Coastguard Worker     return (int32_t)(deFloor(x));
558*35238bceSAndroid Build Coastguard Worker }
deCeilToInt32(double x)559*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deCeilToInt32(double x)
560*35238bceSAndroid Build Coastguard Worker {
561*35238bceSAndroid Build Coastguard Worker     return (int32_t)(deCeil(x));
562*35238bceSAndroid Build Coastguard Worker }
563*35238bceSAndroid Build Coastguard Worker 
564*35238bceSAndroid Build Coastguard Worker /* Arithmetic round */
deRoundFloatToInt16(float x)565*35238bceSAndroid Build Coastguard Worker DE_INLINE int16_t deRoundFloatToInt16(float x)
566*35238bceSAndroid Build Coastguard Worker {
567*35238bceSAndroid Build Coastguard Worker     if (x >= 0.0f)
568*35238bceSAndroid Build Coastguard Worker         return (int16_t)(x + 0.5f);
569*35238bceSAndroid Build Coastguard Worker     else
570*35238bceSAndroid Build Coastguard Worker         return (int16_t)(x - 0.5f);
571*35238bceSAndroid Build Coastguard Worker }
deRoundFloatToInt32(float x)572*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deRoundFloatToInt32(float x)
573*35238bceSAndroid Build Coastguard Worker {
574*35238bceSAndroid Build Coastguard Worker     if (x >= 0.0f)
575*35238bceSAndroid Build Coastguard Worker         return (int32_t)(x + 0.5f);
576*35238bceSAndroid Build Coastguard Worker     else
577*35238bceSAndroid Build Coastguard Worker         return (int32_t)(x - 0.5f);
578*35238bceSAndroid Build Coastguard Worker }
deRoundFloatToInt64(float x)579*35238bceSAndroid Build Coastguard Worker DE_INLINE int64_t deRoundFloatToInt64(float x)
580*35238bceSAndroid Build Coastguard Worker {
581*35238bceSAndroid Build Coastguard Worker     if (x >= 0.0f)
582*35238bceSAndroid Build Coastguard Worker         return (int64_t)(x + 0.5f);
583*35238bceSAndroid Build Coastguard Worker     else
584*35238bceSAndroid Build Coastguard Worker         return (int64_t)(x - 0.5f);
585*35238bceSAndroid Build Coastguard Worker }
586*35238bceSAndroid Build Coastguard Worker 
deRoundToInt16(double x)587*35238bceSAndroid Build Coastguard Worker DE_INLINE int16_t deRoundToInt16(double x)
588*35238bceSAndroid Build Coastguard Worker {
589*35238bceSAndroid Build Coastguard Worker     if (x >= 0.0)
590*35238bceSAndroid Build Coastguard Worker         return (int16_t)(x + 0.5);
591*35238bceSAndroid Build Coastguard Worker     else
592*35238bceSAndroid Build Coastguard Worker         return (int16_t)(x - 0.5);
593*35238bceSAndroid Build Coastguard Worker }
deRoundToInt32(double x)594*35238bceSAndroid Build Coastguard Worker DE_INLINE int32_t deRoundToInt32(double x)
595*35238bceSAndroid Build Coastguard Worker {
596*35238bceSAndroid Build Coastguard Worker     if (x >= 0.0)
597*35238bceSAndroid Build Coastguard Worker         return (int32_t)(x + 0.5);
598*35238bceSAndroid Build Coastguard Worker     else
599*35238bceSAndroid Build Coastguard Worker         return (int32_t)(x - 0.5);
600*35238bceSAndroid Build Coastguard Worker }
deRoundToInt64(double x)601*35238bceSAndroid Build Coastguard Worker DE_INLINE int64_t deRoundToInt64(double x)
602*35238bceSAndroid Build Coastguard Worker {
603*35238bceSAndroid Build Coastguard Worker     if (x >= 0.0)
604*35238bceSAndroid Build Coastguard Worker         return (int64_t)(x + 0.5);
605*35238bceSAndroid Build Coastguard Worker     else
606*35238bceSAndroid Build Coastguard Worker         return (int64_t)(x - 0.5);
607*35238bceSAndroid Build Coastguard Worker }
608*35238bceSAndroid Build Coastguard Worker 
609*35238bceSAndroid Build Coastguard Worker DE_END_EXTERN_C
610*35238bceSAndroid Build Coastguard Worker 
611*35238bceSAndroid Build Coastguard Worker #endif /* _DEMATH_H */
612