最終更新日時(UTC):
が更新

履歴 編集

macro
<cfloat>

LDBL_HAS_SUBNORM(C++17)(C++26で非推奨)

#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

処理系

参照