diff --git a/reference/limits/float_denorm_style.md b/reference/limits/float_denorm_style.md index 578258c28..7a0f7289c 100644 --- a/reference/limits/float_denorm_style.md +++ b/reference/limits/float_denorm_style.md @@ -14,8 +14,10 @@ namespace std { } ``` -この型を返すメンバ変数がC++23にて非推奨化されるため、列挙型も非推奨とされる。 +この型を返すメンバ変数がC++23にて非推奨化されるため、列挙型も非推奨とされる。非推奨の詳細は[`std::numeric_limits::has_denorm`](numeric_limits/has_denorm.md)を参照。 + +## 概要 `std::float_denorm_style`列挙型は、非正規化数(Denormal Number)のサポートに関する情報のための列挙値を提供する。 | 列挙値 | 説明 | diff --git a/reference/limits/numeric_limits/has_denorm.md b/reference/limits/numeric_limits/has_denorm.md index f355ceb1f..7eafd921e 100644 --- a/reference/limits/numeric_limits/has_denorm.md +++ b/reference/limits/numeric_limits/has_denorm.md @@ -6,14 +6,14 @@ * cpp23deprecated[meta cpp] ```cpp -// C++03 -static const float_denorm_style has_denorm; - -// C++11 -static constexpr float_denorm_style has_denorm; +static const float_denorm_style has_denorm; // (1) C++03 +static constexpr float_denorm_style has_denorm; // (1) C++11 ``` * float_denorm_style[link /reference/limits/float_denorm_style.md] +この機能は、C++23で非推奨となった。 + + ## 概要 浮動小数点数型において、型`T`の非正規化数(Denormal Number)のサポート状況を判定する。 @@ -32,6 +32,17 @@ static constexpr float_denorm_style has_denorm; | `long double` | [`LDBL_HAS_SUBNORM`](/reference/cfloat/ldbl_has_subnorm.md) | +## 非推奨・削除の詳細 +C言語側で対応するマクロ`*_HAS_SUBNORM`が廃止されたため、C++側でも非推奨とする。 + +この機能はコンパイル時定数として非正規化数のサポート状況を取得するものであった。しかし、これには以下のような問題があった: + +- ハードウェアによっては非正規化数をサポートしていない場合があり、その場合はソフトウェアエミュレーションによってサポートされている場合がある。この場合、同じ系統のハードウェアであっても将来のバージョンでサポートされる可能性があり、このときにABI破壊を回避しようとすると[`std::denorm_indeterminate`](../float_denorm_style.md)を常に使用せざるを得なくなってしまう +- ハードウェアサポートがある場合でも、実行時のフラグ切り替えによって非正規化数をゼロにフラッシュするように設定することが可能であり、非正規化数のサポート状況は必ずしもコンパイル時に確定するプロパティではない場合がある + +これらの理由から、この機能は有用なものではなく、最悪勘違いして使用される危険性があるため、非推奨とする。 + + ## 例 ```cpp example #include diff --git a/reference/limits/numeric_limits/has_denorm_loss.md b/reference/limits/numeric_limits/has_denorm_loss.md index f16a0b5e3..8726aa17c 100644 --- a/reference/limits/numeric_limits/has_denorm_loss.md +++ b/reference/limits/numeric_limits/has_denorm_loss.md @@ -6,15 +6,27 @@ * cpp23deprecated[meta cpp] ```cpp -// C++03 -static const bool has_denorm_loss; - -// C++11 -static constexpr bool has_denorm_loss; +static const bool has_denorm_loss; // (1) C++03 +static constexpr bool has_denorm_loss; // (1) C++11 ``` +この機能は、C++23で非推奨となった。 + ## 概要 -浮動小数点数型において、精度の損失が非正規化数によるものかを判定する +浮動小数点数型において、精度の損失が非正規化数によるものかを判定する。 + + +## 非推奨・削除の詳細 +非正規化数が使用されたことによって精度が低下した場合にそれを検出する次の2つの方法がIEEE754標準で指定されていた: + +- 非正規化損失(Denormalization loss) +- 不正確な結果(Inexact result) + +実際には1つ目の実装は存在しなかったため、現在のIEE754からは削除されており、2つ目の実装だけが存在している。この機能はこの2つのどちらがその環境の浮動小数点数型で実装されているかを示すものだったが、このような理由によりもはや意味がない状況となった。 + +また、この値は実装によってなぜか異なっている(MSVCだけが浮動小数点数型に対して`true`を返す)。 + +これらの理由から、この機能は有用なものではなく、最悪勘違いして使用される危険性があるため、非推奨とする。 ## 例