<QtNumeric> - Qt Numeric Functions

<QtNumeric> ヘッダーファイルは、一般的な数値関数を提供します。詳細...

Header: #include <QtNumeric>

関数

T qAbs(const T &t)
(since 6.1) typename std::enable_if_t<std::is_unsigned_v<T>, bool> qAddOverflow(T v1, T v2, T *result)
quint64 qFloatDistance(double a, double b)
quint32 qFloatDistance(float a, float b)
int qFpClassify(double val)
int qFpClassify(float val)
bool qFuzzyCompare(double p1, double p2)
bool qFuzzyCompare(float p1, float p2)
bool qFuzzyIsNull(double d)
bool qFuzzyIsNull(float f)
double qInf()
bool qIsFinite(double d)
bool qIsFinite(float f)
bool qIsInf(double d)
bool qIsInf(float f)
bool qIsNaN(double d)
bool qIsNaN(float f)
(since 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)
double qQNaN()
qint64 qRound64(double d)
qint64 qRound64(float d)
int qRound(double d)
int qRound(float d)
double qSNaN()
(since 6.1) typename std::enable_if_t<std::is_unsigned_v<T>, bool> qSubOverflow(T v1, T v2, T *result)

詳細な説明

<QtNumeric> ヘッダーファイルには、数値の比較や調整を行うためのさまざまな数値関数が含まれています。

関数のドキュメント

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

t と型 T の 0 を比較し、絶対値を返します。したがって、T がdouble の場合、t は(double) 0 と比較されます。

例:

int absoluteValue;
int myValue = -4;

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

注: T が符号付き整数型であり、t の値がstd::numeric_limits<T>::min()の場合 、挙動は未定義となります。

[constexpr, since 6.1] template <typename T> typename std::enable_if_t<std::is_unsigned_v<T>, bool> qAddOverflow(T v1, T v2, T *result)

数値型T の2つの値v1 とv2 を足し合わせ、その結果をresult に格納します。加算の結果、型T の有効範囲を超えた場合はtrue を返し、そうでない場合はfalse を返します。

8ビット、16ビット、および32ビットの整数型、ならびにポインタのサイズを持つ整数型については、実装が利用可能であることが保証されています。その他の型に対するオーバーフロー演算は、利用可能な場合でも、プライベートAPIとみなされます。

この関数は Qt 6.1 で導入されました。

quint64 qFloatDistance(double a, double b)

a とb の間で表現可能な浮動小数点数の個数を返します。

この関数はqFloatDistance(float, float) と同じ目的を果たしますが、2つのdouble 型の数値間の距離を返します。範囲が 2つのfloat 型の数値の場合([-DBL_MAX,DBL_MAX] )よりも広いため、戻り値の型は quint64 となります。

qFuzzyCompare()も参照してください 。

quint32 qFloatDistance(float a, float b)

a とb の間で表現可能な浮動小数点数の数を返します。

この関数は、qFuzzyCompare()と同様に、浮動小数点数の近似比較を行うための別の方法を提供します。ただし、この関数は2つの数値間の距離を返すため、呼び出し元は許容誤差を選択することができます。 誤差は相対的なものであるため、例えば 1.0E-5 と 1.00001E-5 の間の距離は 110 となる一方、1.0E36 と 1.00001E36 の間の距離は 127 となります。

この関数は、浮動小数点数の比較に一定の精度が求められる場合に役立ちます。したがって、a とb が等しい場合、0 を返します。32 ビット浮動小数点数に対して返される最大値は 4,278,190,078 です。これは、-FLT_MAX と+FLT_MAX の間の距離に相当します。

引数のいずれかがInfinite またはNaN である場合、この関数は意味のある結果を返しません。これを確認するには、qIsFinite()を呼び出してください。

戻り値は「エラー」と見なすことができます。したがって、例えば2つの32ビット浮動小数点数を比較し、必要な精度が24ビット程度の近似値である場合は、この関数を次のように使用できます:

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

qFuzzyCompare()も参照してください 。

int qFpClassify(double val)

int qFpClassify(float val)

浮動小数点値を分類します。

戻り値は<cmath> で定義されており、val の浮動小数点クラスに応じて、以下のいずれかが返されます:

  • FP_NAN:数値ではない
  • FP_INFINITE 無限大(正または負)
  • FP_ZERO ゼロ(正または負)
  • FP_NORMAL:完全な仮数部を持つ有限数
  • FP_SUBNORMAL:マンティッサが縮小された有限値

[constexpr noexcept] bool qFuzzyCompare(double p1, double p2)

浮動小数点値 `p1 ` と `p2 ` を比較し、両者が等しいとみなされた場合は `true ` を返し、そうでない場合は `false` を返します。

なお、p1 またはp2 のいずれかが 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

2つの数値は相対的に比較され、数値が小さいほど比較の厳密さが高まります。

注: この関数はスレッドセーフです。

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

浮動小数点値 `p1 ` と `p2 ` を比較し、両者が等しいとみなされた場合は `true ` を返し、そうでない場合は `false` を返します。

2つの数値は相対的に比較され、数値が小さいほど比較の厳密さが高くなります。

注: この関数はスレッドセーフです。

[constexpr noexcept] bool qFuzzyIsNull(double d)

d の絶対値が 0.0 から 0.000000000001 以内の場合、true を返します。

注: この関数はスレッドセーフです。

[constexpr noexcept] bool qFuzzyIsNull(float f)

f の絶対値が 0.0 から 0.00001f 以内の場合、true を返します。

注: この関数はスレッドセーフです。

double qInf()

無限大を表すビットパターンをdouble型として返します。

qIsInf()も参照してください 。

bool qIsFinite(double d)

double型のd が有限数である場合、true を返します。

bool qIsFinite(float f)

浮動小数点数f が有限値である場合、true を返します。

bool qIsInf(double d)

double型のd が無限大と等価である場合、true を返します。

qInf()も参照してください 。

bool qIsInf(float f)

浮動小数点数 `f ` が無限大と等しい場合、true を返します。

qInf()も参照してください 。

bool qIsNaN(double d)

double型のd が数値でない場合(NaN)、true を返します。

bool qIsNaN(float f)

浮動小数点数f が数値ではない場合(NaN)、true を返します。

[constexpr, since 6.1] template <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)

v1 とv2 を乗算し、その結果を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 から遠い側に半丸めを行います(例:0.5f → 1、-0.5f → -1)。

注:この関数は 、高精度な計算において正しさを保証するものではありません。

例:

float valueA = 42949672960.3f;
float valueB = 42949672960.7f;

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.3f;
float valueB = 2.7f;

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

注: 値d が範囲int の外にある場合 、挙動は未定義です。

double qSNaN()

シグナリングNaNのビットパターンをdouble型として返します。

[constexpr, since 6.1] template <typename T> typename std::enable_if_t<std::is_unsigned_v<T>, bool> qSubOverflow(T v1, T v2, T *result)

v2 からv1 を差し引き、その結果をresult に格納します。引き算の結果が型T の有効範囲を超えた場合はtrue を返し、それ以外の場合はfalse を返します。

8ビット、16ビット、32ビットの整数型、およびポインタのサイズを持つ整数型については、実装が利用可能であることが保証されています。その他の型に対するオーバーフロー演算は、利用可能な場合でも、プライベートAPIとみなされます。

この関数は Qt 6.1 で導入されました。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.