#define LDBL_HAS_SUBNORM implementation-defined
このマクロは、C++26で廃止予定 (obsolescent) となった。
概要
LDBL_HAS_SUBNORM は、long double型における非正規化数のサポート状況を表すマクロである。
| 値 | 名前 | 非正規化数のサポート状況 |
|---|---|---|
-1 |
indeterminable | 許可するか判定できない |
0 |
absent | 許可しない |
1 |
present | 許可する |
値-1は、浮動小数点操作が、非正規化数の表現をゼロか非ゼロかで一貫して解釈しない場合に、判定不能として表される。
値0は、型のフォーマットに非正規化数が含まれる場合でも、正規化されていない浮動小数点数の入力から結果として非正規化数を生成しない場合に、サポートされていないと判定される。
std::numeric_limits<long double>::has_denormと等しい。
備考
- このマクロは、非正規化数を表現できる場合の、浮動小数点数の正の最小値を表す
LDBL_TRUE_MINのために定義された
非推奨・削除の詳細
このマクロはコンパイル時定数として非正規化数のサポート状況を取得するものであったが、これは必ずしもコンパイル時に確定する値ではなく、有用でないため廃止予定 (obsolescent) となった:
- ハードウェアによっては非正規化数をソフトウェアエミュレーションでサポートする場合があり、サポート状況が判定できず
-1(indeterminable) となることがある - ハードウェアサポートがある場合でも、実行時のフラグ切り替えによって非正規化数をゼロにフラッシュ (flush-to-zero) するよう設定できるため、サポート状況がコンパイル時に確定しない場合がある
C++23では、対応するstd::numeric_limits<long double>::has_denormが同じ理由ですでに非推奨となっている。
例
#include <iostream>
#include <cfloat>
int main()
{
std::cout << DBL_HAS_SUBNORM << std::endl;
std::cout << FLT_HAS_SUBNORM << std::endl;
std::cout << LDBL_HAS_SUBNORM << std::endl;
}
出力例
1
1
1
バージョン
言語
- C++17
処理系
- Clang: 8.0 ✅
- GCC: 9.1 ❌
- Visual C++: ??
参照
- WG14/N1378
xxx_TRUE_MINmacros for<float.h> - P0063R3 C++17 should refer to C11 instead of C99
- P0175R1 Synopses for the C library
- P3348R4 C++26 should refer to C23 not C17
- C++26がC23を参照するようになり、このマクロが廃止予定 (obsolescent) となった