<QtNumeric> - Qt 数值函数

<QtNumeric> 头文件提供了常见的数值函数。 更多...

头文件 #include <QtNumeric>

函数

TqAbs(const T &t)
(自 6.1) typename std::enable_if_t<std::is_unsigned_v<T> || std::is_signed_v<T>, bool>qAddOverflow(T v1, T v2, T *result)
quint32qFloatDistance(float a, float b)
quint64qFloatDistance(double a, double b)
intqFpClassify(double val)
intqFpClassify(float val)
boolqFuzzyCompare(double p1, double p2)
boolqFuzzyCompare(float p1, float p2)
boolqFuzzyIsNull(double d)
boolqFuzzyIsNull(float f)
doubleqInf()
boolqIsFinite(double d)
boolqIsFinite(float f)
boolqIsInf(double d)
boolqIsInf(float f)
boolqIsNaN(double d)
boolqIsNaN(float f)
(自 6.1) typename std::enable_if_t<std::is_unsigned_v<T> || std::is_signed_v<T>, bool>qMulOverflow(T v1, T v2, T *result)
doubleqQNaN()
qint64qRound64(double d)
qint64qRound64(float d)
intqRound(double d)
intqRound(float d)
doubleqSNaN()
(自 6.1) typename std::enable_if_t<std::is_unsigned_v<T> || std::is_signed_v<T>, bool>qSubOverflow(T v1, T v2, T *result)

详细描述

<QtNumeric> 头文件包含用于比较和调整数值的各种数值函数。

函数文档

int qFpClassify(double val)

int qFpClassify(float val)

对一个浮点值进行分类。

返回值在 <cmath> 中定义:根据 val 的浮点类别返回以下之一

  • FP_NAN 不是数字
  • FP_INFINITE 无限大(正或负)
  • FP_ZERO 零(正或负)
  • FP_NORMAL 带有完整尾数的有限值
  • FP_SUBNORMAL 带有缩减尾数的有限值

[constexpr] template <typename T> T qAbs(const T &t)

将类型为 Tt 与 0 进行比较,并返回绝对值。因此,如果 T 是 double 类型,那么 t 将与 (double) 0 进行比较。

示例

int absoluteValue;
int myValue = -4;

absoluteValue = qAbs(myValue);
// absoluteValue == 4

[自 6.1 版起] 模板 <typename T> typename std::enable_if_t<std::is_unsigned_v<T> || std::is_signed_v<T>, bool> qAddOverflow(T v1, T v2, T *result)

将两个数值 v1v2(数值类型 T)相加,并将结果记录在 result 中。如果加法结果超出类型 T 的有效范围,则返回 true,否则返回 false

保证实现可供 8 位、16 位和 32 位整数类型以及指针尺寸的整数类型使用。对于其他类型的溢出数学(如果有的话),被认为是私有 API。

此函数在 Qt 6.1 中引入。

quint32 qFloatDistance(float a, float b)

返回在 ab 之间的可表示浮点数的数量。

此函数提供了类似 qFuzzyCompare 的浮点数近似比较的另一种方法。然而,它返回两个数字之间的距离,这允许调用者选择可接受的误差。误差是相对的,例如,1.0E-5 和 1.00001E-5 之间的距离将为 110,而 1.0E36 和 1.00001E36 之间的距离将为 127。

此函数在需要一定精度的浮点数比较时很有用。因此,如果 ab 相等,它将返回 0。对于 32 位浮点数,它将返回的最大值是 4,278,190,078。这是 -FLT_MAX+FLT_MAX 之间的距离。

如果任何参数是 InfiniteNaN,则该函数给出的结果没有意义。您可以通过调用 qIsFinite 来检查此情况。

返回值可以被视为“误差”,因此,如果您想比较两个 32 位浮点数并且所需的仅是 24 位近似的精度,则可以使用此函数如下:

    if (qFloatDistance(a, b) < (1 << 7)) {   // The last 7 bits are not
                                            // significant
        // precise enough
    }

另请参阅qFuzzyCompare

quint64 qFloatDistance(double a, double b)

返回在 ab 之间的可表示浮点数的数量。

此函数与 qFloatDistance(float, float) 具有相同的目的,但返回两个 double 数字之间的距离。由于范围大于两个 float 数字([-DBL_MAX,DBL_MAX]),返回类型是 quint64。

另请参阅qFuzzyCompare

int qFpClassify(double val)

int qFpClassify(float val)

[ constexpr ] bool qFuzzyCompare(double p1, double )

比较浮点值 p1p2,如果它们被认为是相等的,则返回 true,否则返回 false

请注意,当 p1p2 之一是 0.0 时,比较值将不起作用,当比较的值之一是 NaN 或无限大时也是如此。如果一个值总是 0.0,请使用 qFuzzyIsNull。如果一个值可能为 0.0,一个解决方案是向两个值都加 1.0。

// Instead of comparing with 0.0
qFuzzyCompare(0.0, 1.0e-200); // This will return false
// Compare adding 1 to both values will fix the problem
qFuzzyCompare(1 + 0.0, 1 + 1.0e-200); // This will return true

这两个数字按照相对方式进行比较,其中精确度越强,数字越小。

注意:此函数是线程安全的

[constexpr] bool qFuzzyCompare(float p1, float p2)

比较浮点值 p1p2,如果它们被认为是相等的,则返回 true,否则返回 false

这两个数字按照相对方式进行比较,其中精确度越强,数字越小。

注意:此函数是线程安全的

[constexpr] bool qFuzzyIsNull(double d)

如果 d 的绝对值在 0.000000000001 以内,则返回 true。

注意:此函数是线程安全的

[constexpr] bool qFuzzyIsNull(float f)

如果 f 的绝对值在 0.00001f 以内,则返回 true。

注意:此函数是线程安全的

double qInf()

返回作为 double 的无穷数的位模式。

另请参阅:qIsInf()

bool qIsFinite(double d)

如果 double d 是有限数,则返回 true。

bool qIsFinite(float f)

如果 float f 是有限数,则返回 true。

bool qIsInf(double d)

如果 double d 等价于无穷大,则返回 true。

另请参阅:qInf()

bool qIsInf(float f)

如果 float f 等价于无穷大,则返回 true。

另请参阅:qInf()

bool qIsNaN(double d)

如果 double d 不是数字(NaN),则返回 true。

bool qIsNaN(float f)

如果 float f 不是数字(NaN),则返回 true。

[since 6.1] 模板 <typename T> typename std::enable_if_t<std::is_unsigned_v<T> || std::is_signed_v<T>, bool> qMulOverflow(T v1, T v2, T *result)

v1v2 相乘,并将结果值记录在 result 中。如果乘法超出类型 T 的有效范围,则返回 true,否则返回 false

保证实现可供 8 位、16 位和 32 位整数类型以及指针尺寸的整数类型使用。对于其他类型的溢出数学(如果有的话),被认为是私有 API。

此函数在 Qt 6.1 中引入。

double qQNaN()

返回一个静默 NaN 的位模式作为 double。

另请参阅:qIsNaN()

[constexpr] qint64 qRound64(double d)

d 四舍五入到最接近的 64 位整数。

四舍六入五取偶(例如,0.5 -> 1,-0.5 -> -1)。

注意:此函数不保证高精度正确性。

示例

double valueA = 42949672960.3;
double valueB = 42949672960.7;

qint64 roundedValueA = qRound64(valueA);
// roundedValueA = 42949672960
qint64 roundedValueB = qRound64(valueB);
// roundedValueB = 42949672961

注意:如果值 d 超出 qint64 的范围,行为未定义。

[constexpr] qint64 qRound64(float d)

d 四舍五入到最接近的 64 位整数。

将数值四舍五入到最近的整数(例如 0.5f 变为 1,-0.5f 变为 -1)。

注意:此函数不保证高精度正确性。

示例

float valueA = 42949672960.3;
float valueB = 42949672960.7;

qint64 roundedValueA = qRound64(valueA);
// roundedValueA = 42949672960
qint64 roundedValueB = qRound64(valueB);
// roundedValueB = 42949672961

注意:如果值 d 超出 qint64 的范围,行为未定义。

[constexpr] int qRound(double d)

d 四舍五入到最接近的整数。

四舍六入五取偶(例如,0.5 -> 1,-0.5 -> -1)。

注意:此函数不保证高精度正确性。

示例

double valueA = 2.3;
double valueB = 2.7;

int roundedValueA = qRound(valueA);
// roundedValueA = 2
int roundedValueB = qRound(valueB);
// roundedValueB = 3

注意: 如果值 d 超出 int 的范围,行为是未定义的。

[constexpr] int qRound(float d)

d 四舍五入到最接近的整数。

将数值四舍五入到最近的整数(例如 0.5f 变为 1,-0.5f 变为 -1)。

注意:此函数不保证高精度正确性。

示例

float valueA = 2.3;
float valueB = 2.7;

int roundedValueA = qRound(valueA);
// roundedValueA = 2
int roundedValueB = qRound(valueB);
// roundedValueB = 3

注意: 如果值 d 超出 int 的范围,行为是未定义的。

double qSNaN()

返回一个信号NaN的位模式作为双精度数。

[since 6.1] 模板 <typename T> typename std::enable_if_t<std::is_unsigned_v<T> || std::is_signed_v<T>, bool> qSubOverflow(T v1, T v2, T *result)

v1 中减去 v2,并将结果记录在 result 中。如果减法操作超出了类型 T 的有效范围,则返回 true,否则返回 false

保证实现可供 8 位、16 位和 32 位整数类型以及指针尺寸的整数类型使用。对于其他类型的溢出数学(如果有的话),被认为是私有 API。

此函数在 Qt 6.1 中引入。

© 2024 Qt公司 Ltd。 本文档的贡献者是各自版权的拥有者。提供的文档根据自由软件基金会发布的 GNU自由文档许可版本1.3 的条款进行许可。Qt和相应的标志是芬兰及其在全球的子公司和关联公司的商标。所有其他商标均为其各自所有者的财产。