/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \headerfile <QtMath>
    \title Generic Math Functions
    \ingroup funclists

    \brief The <QtMath> header file provides various math functions.

    These functions are partly convenience definitions for basic math operations
    not available in the C or Standard Template Libraries.

    The header also ensures some constants specified in POSIX, but not present
    in C++ standards (so absent from <math.h> on some platforms), are defined:

    \value M_E The base of the natural logarithms, e = exp(1)
    \value M_LOG2E The base-two logarithm of e
    \value M_LOG10E The base-ten logarithm of e
    \value M_LN2 The natural logarithm of two
    \value M_LN10 The natural logarithm of ten
    \value M_PI The ratio of a circle's circumference to diameter, \unicode{0x3C0}
    \value M_PI_2 Half M_PI, \unicode{0x3C0} / 2
    \value M_PI_4 Quarter M_PI, \unicode{0x3C0} / 4
    \value M_1_PI The inverse of M_PI, 1 / \unicode{0x3C0}
    \value M_2_PI Twice the inverse of M_PI, 2 / \unicode{0x3C0}
    \value M_2_SQRTPI Two divided by the square root of pi, 2 / \unicode{0x221A}\unicode{0x3C0}
    \value M_SQRT2 The square root of two, \unicode{0x221A}2
    \value M_SQRT1_2 The square roof of half, 1 / \unicode{0x221A}2

    \pagekeywords math trigonometry qmath floor ceiling absolute sine cosine tangent inverse tan exponent power natural logarithm pi
*/

/*!
    \fn int qCeil(qreal v)
    Return the ceiling of the value \a v.

    The ceiling is the smallest integer that is not less than \a v.
    For example, if \a v is 41.2, then the ceiling is 42.

    \relates <QtMath>
    \sa qFloor()
*/

/*!
    \fn int qFloor(qreal v)
    Return the floor of the value \a v.

    The floor is the largest integer that is not greater than \a v.
    For example, if \a v is 41.2, then the floor is 41.

    \relates <QtMath>
    \sa qCeil()
*/

/*!
    \fn qreal qFabs(qreal v)
    Returns the absolute value of \a v as a qreal.

    \relates <QtMath>
*/

/*!
    \fn qreal qSin(qreal v)
    Returns the sine of the angle \a v in radians.

    \relates <QtMath>
    \sa qCos(), qTan()
*/

/*!
    \fn  qreal qCos(qreal v)
    Returns the cosine of an angle \a v in radians.

    \relates <QtMath>
    \sa qSin(), qTan()
*/

/*!
    \fn qreal qTan(qreal v)
    Returns the tangent of an angle \a v in radians.

    \relates <QtMath>
    \sa qSin(), qCos()
*/

/*!
    \fn qreal qAcos(qreal v)
    Returns the arccosine of \a v as an angle in radians.
    Arccosine is the inverse operation of cosine.

    \relates <QtMath>
    \sa qAtan(), qAsin(), qCos()
*/

/*!
    \fn qreal qAsin(qreal v)
    Returns the arcsine of \a v as an angle in radians.
    Arcsine is the inverse operation of sine.

    \relates <QtMath>
    \sa qSin(), qAtan(), qAcos()
*/

/*!
    \fn qreal qAtan(qreal v)
    Returns the arctangent of \a v as an angle in radians.
    Arctangent is the inverse operation of tangent.

    \relates <QtMath>
    \sa qTan(), qAcos(), qAsin()
*/

/*!
    \fn qreal qAtan2(qreal y, qreal x)
    Returns the arctangent of a point specified by the coordinates \a y and \a x.
    This function will return the angle (argument) of that point.

    \relates <QtMath>
    \sa qAtan()
*/

/*!
    \fn qreal qSqrt(qreal v)
    Returns the square root of \a v.
    This function returns a NaN if \a v is a negative number.

    \relates <QtMath>
    \sa qPow()
*/

/*!
    \fn qreal qLn(qreal v)
    Returns the natural logarithm of \a v. Natural logarithm uses base e.

    \relates <QtMath>
    \sa qExp()
*/

/*!
    \fn qreal qExp(qreal v)
    Returns the exponential function of \c e to the power of \a v.

    \relates <QtMath>
    \sa qLn()
*/

/*!
    \fn qreal qPow(qreal x, qreal y)
    Returns the value of \a x raised to the power of \a y.
    That is, \a x is the base and \a y is the exponent.

    \relates <QtMath>
    \sa qSqrt()
*/

/*!
    \fn float qDegreesToRadians(float degrees)
    \relates <QtMath>
    \since 5.1

    This function converts the \a degrees in float to radians.

    Example:

    \snippet code/src_corelib_kernel_qmath.cpp 0

    \sa qRadiansToDegrees()
*/

/*!
    \fn double qDegreesToRadians(double degrees)
    \relates <QtMath>
    \since 5.1

    This function converts the \a degrees in double to radians.

    Example:

    \snippet code/src_corelib_kernel_qmath.cpp 1

    \sa qRadiansToDegrees()
*/

/*!
    \fn float qRadiansToDegrees(float radians)
    \relates <QtMath>
    \since 5.1

    This function converts the \a radians in float to degrees.

    Example:

    \snippet code/src_corelib_kernel_qmath.cpp 2

    \sa qDegreesToRadians()
*/

/*!
    \fn double qRadiansToDegrees(double radians)
    \relates <QtMath>
    \since 5.1

    This function converts the \a radians in double to degrees.

    Example:

    \snippet code/src_corelib_kernel_qmath.cpp 3

    \sa qDegreesToRadians()
*/

/*!
    \fn quint32 qNextPowerOfTwo(quint32 value)
    \relates <QtMath>
    \since 5.4

    This function returns the nearest power of two greater than \a value. For 0 it returns 1, and for values larger than or equal to 2^31 it returns 0.
*/

/*!
    \fn quint32 qNextPowerOfTwo(qint32 value)
    \relates <QtMath>
    \since 5.4
    \overload

    This function returns the nearest power of two greater than \a value. For negative values it returns 0.
*/

/*!
    \fn quint64 qNextPowerOfTwo(quint64 value)
    \relates <QtMath>
    \since 5.4

    This function returns the nearest power of two greater than \a value. For 0 it returns 1, and for values larger than or equal to 2^63 it returns 0.
*/

/*!
    \fn quint64 qNextPowerOfTwo(qint64 value)
    \relates <QtMath>
    \since 5.4
    \overload

    This function returns the nearest power of two greater than \a value. For negative values it returns 0.
*/
