e5fcad3 by Lars Knoll at 2009-03-23 1
/****************************************************************************
2
**
89c08c0 by Jason McDonald at 2012-01-11 3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
04e3b30 by Jason McDonald at 2009-09-09 4
** All rights reserved.
858c70f by Jason McDonald at 2009-06-16 5
** Contact: Nokia Corporation (qt-info@nokia.com)
e5fcad3 by Lars Knoll at 2009-03-23 6
**
7
** This file is part of the QtCore module of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
1eea52e by Jyri Tahtela at 2011-05-13 11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
e5fcad3 by Lars Knoll at 2009-03-23 17
**
04e3b30 by Jason McDonald at 2009-09-09 18
** In addition, as a special exception, Nokia gives you certain additional
1eea52e by Jyri Tahtela at 2011-05-13 19
** rights. These rights are described in the Nokia Qt LGPL Exception
04e3b30 by Jason McDonald at 2009-09-09 20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
e5fcad3 by Lars Knoll at 2009-03-23 21
**
1eea52e by Jyri Tahtela at 2011-05-13 22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
29
**
30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
309db73 by Jason McDonald at 2009-08-31 33
**
34
**
35
**
36
**
e5fcad3 by Lars Knoll at 2009-03-23 37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
#ifndef QMATH_H
43
#define QMATH_H
44
45
#include <math.h>
46
47
#include <QtCore/qglobal.h>
48
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 49
#ifdef Q_OS_SYMBIAN
50
#    include <e32math.h>
51
#endif
52
e5fcad3 by Lars Knoll at 2009-03-23 53
QT_BEGIN_HEADER
54
55
QT_BEGIN_NAMESPACE
56
57
QT_MODULE(Core)
58
4f7d94c by Kim Motoyoshi Kalland at 2009-10-02 59
#define QT_SINE_TABLE_SIZE 256
60
61
extern Q_CORE_EXPORT const qreal qt_sine_table[QT_SINE_TABLE_SIZE];
62
e5fcad3 by Lars Knoll at 2009-03-23 63
inline int qCeil(qreal v)
64
{
65
#ifdef QT_USE_MATH_H_FLOATS
66
    if (sizeof(qreal) == sizeof(float))
b2f2967 by David Faure at 2009-09-13 67
        return int(ceilf(float(v)));
e5fcad3 by Lars Knoll at 2009-03-23 68
    else
69
#endif
70
        return int(ceil(v));
71
}
72
73
inline int qFloor(qreal v)
74
{
75
#ifdef QT_USE_MATH_H_FLOATS
76
    if (sizeof(qreal) == sizeof(float))
b2f2967 by David Faure at 2009-09-13 77
        return int(floorf(float(v)));
e5fcad3 by Lars Knoll at 2009-03-23 78
    else
79
#endif
80
        return int(floor(v));
81
}
82
bc49609 by Aleksandar Sasha Babic at 2009-12-02 83
inline qreal qFabs(qreal v)
84
{
85
#ifdef QT_USE_MATH_H_FLOATS
86
    if(sizeof(qreal) == sizeof(float))
87
        return fabsf(float(v));
88
    else
89
#endif
90
        return fabs(v);
91
}
92
e5fcad3 by Lars Knoll at 2009-03-23 93
inline qreal qSin(qreal v)
94
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 95
#ifdef Q_OS_SYMBIAN
96
    TReal sin_v;
97
    Math::Sin(sin_v, static_cast<TReal>(v));
98
    return static_cast<qreal>(sin_v);
99
#else
100
#    ifdef QT_USE_MATH_H_FLOATS
101
        if (sizeof(qreal) == sizeof(float))
102
            return sinf(float(v));
103
        else
104
#    endif
105
            return sin(v);
e5fcad3 by Lars Knoll at 2009-03-23 106
#endif
107
}
108
109
inline qreal qCos(qreal v)
110
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 111
#ifdef Q_OS_SYMBIAN
112
    TReal cos_v;
113
    Math::Cos(cos_v, static_cast<TReal>(v));
114
    return static_cast<qreal>(cos_v);
115
#else
116
#    ifdef QT_USE_MATH_H_FLOATS
117
        if (sizeof(qreal) == sizeof(float))
118
            return cosf(float(v));
119
        else
120
#    endif
121
            return cos(v);
e5fcad3 by Lars Knoll at 2009-03-23 122
#endif
123
}
124
bc49609 by Aleksandar Sasha Babic at 2009-12-02 125
inline qreal qTan(qreal v)
126
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 127
#ifdef Q_OS_SYMBIAN
128
    TReal tan_v;
129
    Math::Tan(tan_v, static_cast<TReal>(v));
130
    return static_cast<qreal>(tan_v);
131
#else
132
#    ifdef QT_USE_MATH_H_FLOATS
133
        if (sizeof(qreal) == sizeof(float))
134
            return tanf(float(v));
135
        else
136
#    endif
137
            return tan(v);
bc49609 by Aleksandar Sasha Babic at 2009-12-02 138
#endif
139
}
140
e5fcad3 by Lars Knoll at 2009-03-23 141
inline qreal qAcos(qreal v)
142
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 143
#ifdef Q_OS_SYMBIAN
144
    TReal acos_v;
145
    Math::ACos(acos_v, static_cast<TReal>(v));
146
    return static_cast<qreal>(acos_v);
147
#else
148
#    ifdef QT_USE_MATH_H_FLOATS
149
        if (sizeof(qreal) == sizeof(float))
150
            return acosf(float(v));
151
        else
152
#    endif
153
           return acos(v);
e5fcad3 by Lars Knoll at 2009-03-23 154
#endif
155
}
156
bc49609 by Aleksandar Sasha Babic at 2009-12-02 157
inline qreal qAsin(qreal v)
158
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 159
#ifdef Q_OS_SYMBIAN
160
    TReal asin_v;
161
    Math::ASin(asin_v, static_cast<TReal>(v));
162
    return static_cast<qreal>(asin_v);
163
#else
164
#    ifdef QT_USE_MATH_H_FLOATS
165
        if (sizeof(qreal) == sizeof(float))
166
            return asinf(float(v));
167
        else
168
#    endif
169
            return asin(v);
bc49609 by Aleksandar Sasha Babic at 2009-12-02 170
#endif
171
}
172
173
inline qreal qAtan(qreal v)
174
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 175
#ifdef Q_OS_SYMBIAN
176
    TReal atan_v;
177
    Math::ATan(atan_v, static_cast<TReal>(v));
178
    return static_cast<qreal>(atan_v);
179
#else
180
#    ifdef QT_USE_MATH_H_FLOATS
181
        if(sizeof(qreal) == sizeof(float))
182
            return atanf(float(v));
183
        else
184
#    endif
185
            return atan(v);
bc49609 by Aleksandar Sasha Babic at 2009-12-02 186
#endif
187
}
188
189
inline qreal qAtan2(qreal x, qreal y)
190
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 191
#ifdef Q_OS_SYMBIAN
192
    TReal atan2_v;
193
    Math::ATan(atan2_v, static_cast<TReal>(x), static_cast<TReal>(y));
194
    return static_cast<qreal>(atan2_v);
195
#else
196
#    ifdef QT_USE_MATH_H_FLOATS
197
        if(sizeof(qreal) == sizeof(float))
198
            return atan2f(float(x), float(y));
199
        else
200
#    endif
201
            return atan2(x, y);
bc49609 by Aleksandar Sasha Babic at 2009-12-02 202
#endif
203
}
204
e5fcad3 by Lars Knoll at 2009-03-23 205
inline qreal qSqrt(qreal v)
206
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 207
#ifdef Q_OS_SYMBIAN
208
    TReal sqrt_v;
209
    Math::Sqrt(sqrt_v, static_cast<TReal>(v));
210
    return static_cast<qreal>(sqrt_v);
211
#else
212
#    ifdef QT_USE_MATH_H_FLOATS
213
        if (sizeof(qreal) == sizeof(float))
214
            return sqrtf(float(v));
215
        else
216
#    endif
217
            return sqrt(v);
e5fcad3 by Lars Knoll at 2009-03-23 218
#endif
219
}
220
221
inline qreal qLn(qreal v)
222
{
223
#ifdef QT_USE_MATH_H_FLOATS
224
    if (sizeof(qreal) == sizeof(float))
b2f2967 by David Faure at 2009-09-13 225
        return logf(float(v));
e5fcad3 by Lars Knoll at 2009-03-23 226
    else
227
#endif
228
        return log(v);
229
}
230
bc49609 by Aleksandar Sasha Babic at 2009-12-02 231
inline qreal qExp(qreal v)
232
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 233
#ifdef Q_OS_SYMBIAN
234
    TReal exp_v;
235
    Math::Exp(exp_v, static_cast<TReal>(v));
236
    return static_cast<qreal>(exp_v);
237
#else
bc49609 by Aleksandar Sasha Babic at 2009-12-02 238
    // only one signature
239
    // exists, exp(double)
240
    return exp(v);
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 241
#endif
bc49609 by Aleksandar Sasha Babic at 2009-12-02 242
}
243
e5fcad3 by Lars Knoll at 2009-03-23 244
inline qreal qPow(qreal x, qreal y)
245
{
8152bd1 by Aleksandar Sasha Babic at 2009-12-15 246
#ifdef Q_OS_SYMBIAN
247
    TReal pow_v;
248
    Math::Pow(pow_v, static_cast<TReal>(x), static_cast<TReal>(y));
249
    return static_cast<qreal>(pow_v);
250
#else
251
#    ifdef QT_USE_MATH_H_FLOATS
252
        if (sizeof(qreal) == sizeof(float))
253
            return powf(float(x), float(y));
254
        else
255
#    endif
256
            return pow(x, y);
e5fcad3 by Lars Knoll at 2009-03-23 257
#endif
258
}
259
b358143 by Volker Hilsheimer at 2009-07-08 260
#ifndef M_PI
261
#define M_PI (3.14159265358979323846)
262
#endif
263
4f7d94c by Kim Motoyoshi Kalland at 2009-10-02 264
inline qreal qFastSin(qreal x)
265
{
266
    int si = int(x * (0.5 * QT_SINE_TABLE_SIZE / M_PI)); // Would be more accurate with qRound, but slower.
267
    qreal d = x - si * (2.0 * M_PI / QT_SINE_TABLE_SIZE);
268
    int ci = si + QT_SINE_TABLE_SIZE / 4;
269
    si &= QT_SINE_TABLE_SIZE - 1;
270
    ci &= QT_SINE_TABLE_SIZE - 1;
271
    return qt_sine_table[si] + (qt_sine_table[ci] - 0.5 * qt_sine_table[si] * d) * d;
272
}
273
274
inline qreal qFastCos(qreal x)
275
{
276
    int ci = int(x * (0.5 * QT_SINE_TABLE_SIZE / M_PI)); // Would be more accurate with qRound, but slower.
277
    qreal d = x - ci * (2.0 * M_PI / QT_SINE_TABLE_SIZE);
278
    int si = ci + QT_SINE_TABLE_SIZE / 4;
279
    si &= QT_SINE_TABLE_SIZE - 1;
280
    ci &= QT_SINE_TABLE_SIZE - 1;
281
    return qt_sine_table[si] - (qt_sine_table[ci] + 0.5 * qt_sine_table[si] * d) * d;
282
}
283
e5fcad3 by Lars Knoll at 2009-03-23 284
QT_END_NAMESPACE
285
286
QT_END_HEADER
287
288
#endif // QMATH_H