最終更新日時: 2026年06月15日 14時22分22秒 (JST)
Akira Takahashi が更新

履歴 編集

macro
<cfloat>

# DBL_HAS_SUBNORM(C++17)(C++26で非推奨)

    #define DBL_HAS_SUBNORM implementation-defined

このマクロは、C++26で廃止予定 (obsolescent) となった。

## 概要

`DBL_HAS_SUBNORM` は、`double`型における非正規化数のサポート状況を表すマクロである。

値 | 名前 | 非正規化数のサポート状況
--- | --- | ---
`-1` | indeterminable | 許可するか判定できない
`0` | absent | 許可しない
`1` | present | 許可する

値`-1`は、浮動小数点操作が、非正規化数の表現をゼロか非ゼロかで一貫して解釈しない場合に、判定不能として表される。

値`0`は、型のフォーマットに非正規化数が含まれる場合でも、正規化されていない浮動小数点数の入力から結果として非正規化数を生成しない場合に、サポートされていないと判定される。

`std::numeric_limits<double>::has_denorm`と等しい。

## 備考

- このマクロは、非正規化数を表現できる場合の、浮動小数点数の正の最小値を表す`DBL_TRUE_MIN`のために定義された

## 非推奨・削除の詳細

このマクロはコンパイル時定数として非正規化数のサポート状況を取得するものであったが、これは必ずしもコンパイル時に確定する値ではなく、有用でないため廃止予定 (obsolescent) となった：

- ハードウェアによっては非正規化数をソフトウェアエミュレーションでサポートする場合があり、サポート状況が判定できず`-1` (indeterminable) となることがある
- ハードウェアサポートがある場合でも、実行時のフラグ切り替えによって非正規化数をゼロにフラッシュ (flush-to-zero) するよう設定できるため、サポート状況がコンパイル時に確定しない場合がある

C++23では、対応する`std::numeric_limits<double>::has_denorm`が同じ理由ですでに非推奨となっている。

## 例

    #include <iostream>
    #include <cfloat>

    int main()
    {
      std::cout << FLT_HAS_SUBNORM << std::endl;
      std::cout << DBL_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_MIN` macros 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) となった