名前空間
変種
操作

std::numeric_limits::tinyness_before

提供: cppreference.com
 
 
 
型サポート
型プロトタイプ
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20以前)
(C++11)(C++20で非推奨)
(C++11)
型特性定数
メタ関数
(C++17)
エンディアン
(C++20)
サポートされている操作
関係と性質の問い合わせ
(C++11)
(C++11)
型変更
(C++11)(C++11)(C++11)
型変換
(C++11)
(C++11)
(C++17)
(C++11)(C++20以前)(C++17)
 
 
static const bool tinyness_before;
(C++11以前)
static constexpr bool tinyness_before;
(C++11およびそれ以降)

std::numeric_limits<T>::tinyness_before の値は、浮動小数点式の結果が丸めの前にアンダーフローをテストするすべての浮動小数点型 T に対して true になります。

目次

[編集] 標準の特殊化

T std::numeric_limits<T>::tinyness_before の値
/* 非特殊化 */ false
bool false
char false
signed char false
unsigned char false
wchar_t false
char16_t false
char32_t false
short false
unsigned short false
int false
unsigned int false
long false
unsigned long false
long long false
unsigned long long false
float 処理系定義
double 処理系定義
long double 処理系定義

[編集] ノート

標準準拠の IEEE 754 浮動小数点の実装は、浮動小数点のアンダーフローを検出することが要求されます。 これが発生する可能性のある状況は2パターンあります。

1) 指数の範囲と精度が無制限であったならば生成されたであろう結果の絶対値が std::numeric_limits<T>::min() より小さければ、アンダーフローが発生します (そして FE_UNDERFLOW が発生するかもしれません)。 そのような処理系は、丸めの前に小ささを検出します (UltraSparc、 POWER など)。
2) 結果をターゲットの浮動小数点型に (つまり std::numeric_limits<T>::digits ビットに) 丸めた後、その結果の絶対値が std::numeric_limits<T>::min() より小さければ、アンダーフローが発生します (そして FE_UNDERFLOW が発生するかもしれません)。 形式的には、指数の範囲が無制限であったならば計算されたであろう非ゼロな結果の絶対値が std::numeric_limits<T>::min() より小さければ、です。 そのような処理系は、丸めの後に小ささを検出します (SuperSparc など)。

[編集]

最も大きな非正規化数と、 1.0 より1マシンイプシロンだけ大きな値の乗算結果は、丸めの前は小さな値 0x0.fffffffffffff8p-1022 ですが、丸めの後は通常の値 1p-1022 になります。 このテストを実行するために使用した処理系 (IBM Power7) は丸めの前に小ささを検出します。

#include <iostream>
#include <limits>
#include <cmath>
#include <cfenv>
int main()
{
    std::cout << "Tinyness before: " << std::boolalpha
              << std::numeric_limits<double>::tinyness_before << '\n';
 
    double denorm_max = std::nextafter(std::numeric_limits<double>::min(), 0);
    double multiplier = 1 + std::numeric_limits<double>::epsilon();
 
    std::feclearexcept(FE_ALL_EXCEPT);
 
    double result = denorm_max*multiplier; // Underflow only if tinyness_before
 
    if(std::fetestexcept(FE_UNDERFLOW))
        std::cout << "Underflow detected\n";
 
    std::cout << std::hexfloat << denorm_max << " x " << multiplier  <<  " = "
              << result << '\n';
}

出力例:

Tinyness before: true
Underflow detected
0xf.ffffffffffffp-1030 x 0x1.0000000000001p+0 = 0x1p-1022

[編集] 関連項目

精度の損失を不正確な結果ではなく非正規化損失として検出する浮動小数点型を識別します
(パブリック静的メンバ定数) [edit]
[static]
浮動小数点型によって使用される非正規化形式を識別します
(パブリック静的メンバ定数) [edit]