Skip to content

Commit

Permalink
has_denorm(_loss) : 非推奨の詳細を記載
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed Jun 8, 2023
1 parent 1007613 commit 6b1443d
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 12 deletions.
4 changes: 3 additions & 1 deletion reference/limits/float_denorm_style.md
Expand Up @@ -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)のサポートに関する情報のための列挙値を提供する。
| 列挙値 | 説明 |
Expand Down
21 changes: 16 additions & 5 deletions reference/limits/numeric_limits/has_denorm.md
Expand Up @@ -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)のサポート状況を判定する。

Expand All @@ -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 <iostream>
Expand Down
24 changes: 18 additions & 6 deletions reference/limits/numeric_limits/has_denorm_loss.md
Expand Up @@ -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`を返す)。

これらの理由から、この機能は有用なものではなく、最悪勘違いして使用される危険性があるため、非推奨とする。


##
Expand Down

1 comment on commit 6b1443d

@yohhoy
Copy link
Member

@yohhoy yohhoy commented on 6b1443d Jun 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rel #1145

Please sign in to comment.