Skip to content

Commit 7accb42

Browse files
committed
cmath: C++26対応として、f(max|min)imum[_num]を追加 #1514
1 parent 59a1086 commit 7accb42

File tree

7 files changed

+393
-8
lines changed

7 files changed

+393
-8
lines changed

lang/cpp26.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,12 +362,21 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
362362

363363

364364
### 数値
365+
- [`<cmath>`](/reference/cmath.md)に、浮動小数点数の最大値・最小値を求める以下の関数を追加
366+
- [`std::fmaximum()`](/reference/cmath/fmaximum.md) (-0.0と+0.0では+0.0を返し、NaNと数値ではNaNを返す)
367+
- [`std::fmaximum_num()`](/reference/cmath/fmaximum_num.md) (-0.0と+0.0では+0.0を返し、NaNと数値では数値を返す)
368+
- [`std::fminimum()`](/reference/cmath/fminimum.md) (-0.0と+0.0では-0.0を返し、NaNと数値ではNaNを返す)
369+
- [`std::fminimum_num()`](/reference/cmath/fminimum_num.md) (-0.0と-0.0では+0.0を返し、NaNと数値では数値を返す)
365370
- [`<numeric>`](/reference/numeric.md)に、飽和演算 (Saturation Arithmetic) として、型の表現可能な範囲で演算を行う以下の関数を追加
366371
- [`std::add_sat()`](/reference/numeric/add_sat.md)
367372
- [`std::sub_sat()`](/reference/numeric/sub_sat.md)
368373
- [`std::mul_sat()`](/reference/numeric/mul_sat.md)
369374
- [`std::div_sat()`](/reference/numeric/div_sat.md)
370375
- [`std::saturate_cast()`](/reference/numeric/saturate_cast.md)
376+
- [`std::complex`](/reference/complex/complex.md)を構造化束縛や、将来のパターンマッチで使用できるようタプルインタフェースの特殊化を追加
377+
- [`<random>`](/reference/random.md)の範囲`[0, 1)`の乱数を生成する[`std::generate_canonical()`](/reference/random/generate_canonical.md)を、望ましい統計的性質を保証するようアルゴリズムと制約を変更
378+
- [`<random>`](/reference/random.md)に、乱数列を生成する[`std::ranges::generate_random()`](/reference/random/generate_random.md)関数を追加
379+
- [`<random>`](/reference/random.md)に、乱数生成器は並列シミュレーションに効果的なカウンターベースのPhilox乱数生成器として、[`std::philox_engine`](/reference/random/philox_engine.md)クラス、およびその別名である[`std::philox4x32`](/reference/random/philox4x32.md)[`std::philox4x64`](/reference/random/philox4x64.md)を追加
371380
- [`<cmath>`](/reference/cmath.md)の以下の関数を、`constexpr`に対応 (特殊関数と、グローバルの丸めモードに依存する丸め関数以外の全て)
372381
- [`std::cos()`](/reference/cmath/cos.md)
373382
- [`std::sin()`](/reference/cmath/sin.md)
@@ -423,10 +432,6 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
423432
- [`std::conj()`](/reference/complex/complex/conj.md) (算術型オーバーロード)
424433
- [`std::imag()`](/reference/complex/complex/imag_free.md) (算術型オーバーロード)
425434
- [`std::real()`](/reference/complex/complex/real_free.md) (算術型オーバーロード)
426-
- [`std::complex`](/reference/complex/complex.md)を構造化束縛や、将来のパターンマッチで使用できるようタプルインタフェースの特殊化を追加
427-
- [`<random>`](/reference/random.md)の範囲`[0, 1)`の乱数を生成する[`std::generate_canonical()`](/reference/random/generate_canonical.md)を、望ましい統計的性質を保証するようアルゴリズムと制約を変更
428-
- [`<random>`](/reference/random.md)に、乱数列を生成する[`std::ranges::generate_random()`](/reference/random/generate_random.md)関数を追加
429-
- [`<random>`](/reference/random.md)に、乱数生成器は並列シミュレーションに効果的なカウンターベースのPhilox乱数生成器として、[`std::philox_engine`](/reference/random/philox_engine.md)クラス、およびその別名である[`std::philox4x32`](/reference/random/philox4x32.md)[`std::philox4x64`](/reference/random/philox4x64.md)を追加
430435

431436

432437
### ユーティリティ

reference/cmath.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,13 @@ NaN を返さなければならないが定義域エラーを報告してはな
367367

368368
| 名前 | 説明 | 対応バージョン |
369369
|-------------------------|--------|----------------|
370-
| [`fmax`](cmath/fmax.md) | 最大値 | C++11 |
371-
| [`fmin`](cmath/fmin.md) | 最小値 | C++11 |
372-
| [`fdim`](cmath/fdim.md) | 正の差 | C++11 |
370+
| [`fmax`](cmath/fmax.md) | 最大値 (`-0.0``+0.0`では未規定、NaNと値では値を返す) | C++11 |
371+
| [`fmin`](cmath/fmin.md) | 最小値 (`-0.0``+0.0`では未規定、NaNと値では値を返す) | C++11 |
372+
| [`fmaximum`](cmath/fmaximum.md) | 最大値 (`-0.0``+0.0`では`+0.0`、NaNと値ではNaNを返す) | C++26 |
373+
| [`fmaximum_num`](cmath/fmaximum_num.md) | 最大値 (`-0.0``+0.0`では`+0.0`、NaNと値では値を返す) | C++26 |
374+
| [`fminimum`](cmath/fminimum.md) | 最小値 (`-0.0``+0.0`では`-0.0`、NaNと値ではNaNを返す) | C++26 |
375+
| [`fminimum_num`](cmath/fminimum_num.md) | 最小値 (`-0.0``+0.0`では`-0.0`、NaNと値では値を返す) | C++26 |
376+
| [`fdim`](cmath/fdim.md) | 正の差 | C++11 |
373377

374378

375379
## <a id="floating-multiply-add" href="#floating-multiply-add">乗算-加算</a>

reference/cmath/fmax.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ namespace std {
4848
- (6) : `float`型規定
4949
- (7) : `long double`型規定
5050
51+
同じ目的のほかの関数との比較は以下。
52+
53+
| 関数名 | -0.0 と +0.0 の比較 | NaN を含む場合の挙動 |
54+
|---|---|---|
55+
| [`fmax`](fmax.md) | 未規定 | NaN でない方を返す |
56+
| [`fmaximum`](fmaximum.md) | +0.0 を返す | NaN を返す |
57+
| [`fmaximum_num`](fmaximum_num.md) | +0.0 を返す | NaN でない方を返す |
5158
5259
## 戻り値
5360
引数の最大値を返す。
@@ -57,7 +64,7 @@ namespace std {
5764
- 処理系が IEC 60559 に準拠している場合([`std::numeric_limits`](../limits/numeric_limits.md)`<T>::`[`is_iec559`](../limits/numeric_limits/is_iec559.md)`() != false`)、以下の規定が追加される。
5865
- 引数の1つが NaN の場合 NaN でない方を返す。
5966
- 引数が2つとも NaN の場合 NaN を返す。
60-
- 理想的には `fmax(-0.0, +0.0)` は `+0` を返す。
67+
- `-0.0`と`+0.0`の比較としてどちらが返されるかは未規定
6168
- C++23では、(1), (2), (3)が(4)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された
6269
6370
@@ -135,6 +142,11 @@ namespace std {
135142
* std::common_type[link ../type_traits/common_type.md]
136143
137144
145+
## 関連項目
146+
- [`fmaximum`](fmaximum.md)
147+
- [`fmaximum_num`](fmaximum_num.md)
148+
149+
138150
## 参照
139151
- [P0533R9 constexpr for `<cmath>` and `<cstdlib>`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0533r9.pdf)
140152
- C++23での、一部関数の`constexpr`対応

reference/cmath/fmaximum.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# fmaximum
2+
* cmath[meta header]
3+
* std[meta namespace]
4+
* function[meta id-type]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std {
9+
constexpr floating-point-type
10+
fmaximum(floating-point-type x,
11+
floating-point-type y); // (1) C++26
12+
13+
constexpr Promoted
14+
fmaximum(Arithmetic1 x,
15+
Arithmetic2 y); // (2) C++26
16+
}
17+
```
18+
* Promoted[italic]
19+
* Arithmetic1[italic]
20+
* Arithmetic2[italic]
21+
22+
## 概要
23+
浮動小数点数型の最大値を求める。
24+
25+
- (1) : 浮動小数点数型に対するオーバーロード
26+
- (2) : 算術型に対するオーバーロード (大きい精度にキャストして計算される。整数は`double`で計算される)
27+
28+
29+
同じ目的のほかの関数との比較は以下。
30+
31+
| 関数名 | -0.0 と +0.0 の比較 | NaN を含む場合の挙動 | 備考 |
32+
|---|---|---|---|
33+
| [`fmax`](fmax.md) | 未規定 | NaN でない方を返す | |
34+
| [`fmaximum`](fmaximum.md) | +0.0 を返す | NaN を返す | エラー伝播を優先 |
35+
| [`fmaximum_num`](fmaximum_num.md) | +0.0 を返す | NaN でない方を返す | 数値を優先 |
36+
37+
38+
## 戻り値
39+
引数の最大値を返す。
40+
41+
42+
## 備考
43+
- 戻り値は正確で、現在の丸めモードに依存しない。
44+
- 処理系が IEC 60559 に準拠している場合([`std::numeric_limits`](../limits/numeric_limits.md)`<T>::`[`is_iec559`](../limits/numeric_limits/is_iec559.md)`() != false`)、以下の規定が追加される。
45+
- 引数のいずれかが NaN の場合、 NaN を返す。
46+
- `-0.0`と`+0.0`の比較では、`+0.0`を返す。
47+
48+
49+
## 例
50+
```cpp example
51+
#include <print>
52+
#include <cmath>
53+
54+
int main() {
55+
std::println("fmaximum( 0.0, -1.0) = {:+}", std::fmaximum(0.0, -1.0));
56+
std::println("fmaximum(-0.0, +0.0) = {:+}", std::fmaximum(-0.0, +0.0));
57+
std::println("fmaximum( 0.0, +1.0) = {:+}", std::fmaximum(0.0, +1.0));
58+
std::println("fmaximum( 0.0, nan) = {:+}", std::fmaximum(0.0, std::nan("")));
59+
std::println("fmaximum( nan, nan) = {:+}", std::fmaximum(std::nan(""), std::nan("")));
60+
}
61+
```
62+
* std::fmaximum[color ff0000]
63+
* std::nan[link nanf.md]
64+
65+
### 出力例
66+
```
67+
fmaximum( 0.0, -1.0) = +0
68+
fmaximum(-0.0, +0.0) = +0
69+
fmaximum( 0.0, +1.0) = +1
70+
fmaximum( 0.0, nan) = +nan
71+
fmaximum( nan, nan) = +nan
72+
```
73+
74+
## バージョン
75+
### 言語
76+
- C++26
77+
78+
### 処理系
79+
- [Clang](/implementation.md#clang): 21.0 [mark noimpl]
80+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
81+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
82+
83+
84+
## 関連項目
85+
- [`fmax`](fmax.md)
86+
- [`fmaximum_num`](fmaximum_num.md)
87+
88+
89+
## 参照
90+
- [P3008R6 Atomic floating-point min/max](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3008r6.html)

reference/cmath/fmaximum_num.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# fmaximum_num
2+
* cmath[meta header]
3+
* std[meta namespace]
4+
* function[meta id-type]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std {
9+
constexpr floating-point-type
10+
fmaximum_num(floating-point-type x,
11+
floating-point-type y); // (1) C++26
12+
13+
constexpr Promoted
14+
fmaximum_num(Arithmetic1 x,
15+
Arithmetic2 y); // (2) C++26
16+
}
17+
```
18+
* Promoted[italic]
19+
* Arithmetic1[italic]
20+
* Arithmetic2[italic]
21+
22+
## 概要
23+
浮動小数点数型の最大値を求める。
24+
25+
- (1) : 浮動小数点数型に対するオーバーロード
26+
- (2) : 算術型に対するオーバーロード (大きい精度にキャストして計算される。整数は`double`で計算される)
27+
28+
29+
同じ目的のほかの関数との比較は以下。
30+
31+
| 関数名 | -0.0 と +0.0 の比較 | NaN を含む場合の挙動 | 備考 |
32+
|---|---|---|---|
33+
| [`fmax`](fmax.md) | 未規定 | NaN でない方を返す | |
34+
| [`fmaximum`](fmaximum.md) | +0.0 を返す | NaN を返す | エラー伝播を優先 |
35+
| [`fmaximum_num`](fmaximum_num.md) | +0.0 を返す | NaN でない方を返す | 数値を優先 |
36+
37+
38+
## 戻り値
39+
引数の最大値を返す。
40+
41+
42+
## 備考
43+
- 戻り値は正確で、現在の丸めモードに依存しない。
44+
- 処理系が IEC 60559 に準拠している場合([`std::numeric_limits`](../limits/numeric_limits.md)`<T>::`[`is_iec559`](../limits/numeric_limits/is_iec559.md)`() != false`)、以下の規定が追加される。
45+
- 引数の1つが NaN の場合 NaN でない方を返す。
46+
- 引数が2つとも NaN の場合 NaN を返す。
47+
- `-0.0`と`+0.0`の比較では、`+0.0`を返す。
48+
- IEEE 754 の `maximumNum` に対応する。
49+
50+
51+
## 例
52+
```cpp example
53+
#include <print>
54+
#include <cmath>
55+
56+
int main() {
57+
std::println("fmaximum_num( 0.0, -1.0) = {:+}", std::fmaximum_num(0.0, -1.0));
58+
std::println("fmaximum_num(-0.0, +0.0) = {:+}", std::fmaximum_num(-0.0, +0.0));
59+
std::println("fmaximum_num( 0.0, +1.0) = {:+}", std::fmaximum_num(0.0, +1.0));
60+
std::println("fmaximum_num( 0.0, nan) = {:+}", std::fmaximum_num(0.0, std::nan("")));
61+
std::println("fmaximum_num( nan, nan) = {:+}", std::fmaximum_num(std::nan(""), std::nan("")));
62+
}
63+
```
64+
* std::fmaximum_num[color ff0000]
65+
* std::nan[link nanf.md]
66+
67+
### 出力例
68+
```
69+
fmaximum_num( 0.0, -1.0) = +0
70+
fmaximum_num(-0.0, +0.0) = +0
71+
fmaximum_num( 0.0, +1.0) = +1
72+
fmaximum_num( 0.0, nan) = +0
73+
fmaximum_num( nan, nan) = +nan
74+
```
75+
76+
## バージョン
77+
### 言語
78+
- C++26
79+
80+
### 処理系
81+
- [Clang](/implementation.md#clang): 21.0 [mark noimpl]
82+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
83+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
84+
85+
86+
## 関連項目
87+
- [`fmax`](fmax.md)
88+
- [`fmaximum`](fmaximum.md)
89+
90+
91+
## 参照
92+
- [P3008R6 Atomic floating-point min/max](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3008r6.html)

reference/cmath/fminimum.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# fminimum
2+
* cmath[meta header]
3+
* std[meta namespace]
4+
* function[meta id-type]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std {
9+
constexpr floating-point-type
10+
fminimum(floating-point-type x,
11+
floating-point-type y); // (1) C++26
12+
13+
constexpr Promoted
14+
fminimum(Arithmetic1 x,
15+
Arithmetic2 y); // (2) C++26
16+
}
17+
```
18+
* Promoted[italic]
19+
* Arithmetic1[italic]
20+
* Arithmetic2[italic]
21+
22+
## 概要
23+
浮動小数点数型の最小値を求める。
24+
25+
- (1) : 浮動小数点数型に対するオーバーロード
26+
- (2) : 算術型に対するオーバーロード (大きい精度にキャストして計算される。整数は`double`で計算される)
27+
28+
29+
同じ目的のほかの関数との比較は以下。
30+
31+
| 関数名 | -0.0 と +0.0 の比較 | NaN を含む場合の挙動 | 備考 |
32+
|---|---|---|---|
33+
| [`fmin`](fmin.md) | 未規定 | NaN でない方を返す | |
34+
| [`fminimum`](fminimum.md) | -0.0 を返す | NaN を返す | エラー伝播を優先 |
35+
| [`fminimum_num`](fmaximum_num.md) | -0.0 を返す | NaN でない方を返す | 数値を優先 |
36+
37+
38+
## 戻り値
39+
引数の最小値を返す。
40+
41+
42+
## 備考
43+
- 戻り値は正確で、現在の丸めモードに依存しない。
44+
- 処理系が IEC 60559 に準拠している場合([`std::numeric_limits`](../limits/numeric_limits.md)`<T>::`[`is_iec559`](../limits/numeric_limits/is_iec559.md)`() != false`)、以下の規定が追加される。
45+
- 引数のいずれかが NaN の場合、 NaN を返す。
46+
- `-0.0`と`+0.0`の比較では、`-0.0`を返す。
47+
48+
49+
## 例
50+
```cpp example
51+
#include <print>
52+
#include <cmath>
53+
54+
int main() {
55+
std::println("fminimum( 0.0, -1.0) = {:+}", std::fminimum(0.0, -1.0));
56+
std::println("fminimum(-0.0, +0.0) = {:+}", std::fminimum(-0.0, +0.0));
57+
std::println("fminimum( 0.0, +1.0) = {:+}", std::fminimum(0.0, +1.0));
58+
std::println("fminimum( 0.0, nan) = {:+}", std::fminimum(0.0, std::nan("")));
59+
std::println("fminimum( nan, nan) = {:+}", std::fminimum(std::nan(""), std::nan("")));
60+
}
61+
```
62+
* std::fminimum[color ff0000]
63+
* std::nan[link nanf.md]
64+
65+
### 出力例
66+
```
67+
fminimum( 0.0, -1.0) = -1
68+
fminimum(-0.0, +0.0) = -0
69+
fminimum( 0.0, +1.0) = +0
70+
fminimum( 0.0, nan) = +nan
71+
fminimum( nan, nan) = +nan
72+
```
73+
74+
## バージョン
75+
### 言語
76+
- C++26
77+
78+
### 処理系
79+
- [Clang](/implementation.md#clang): 21.0 [mark noimpl]
80+
- [GCC](/implementation.md#gcc): 15 [mark noimpl]
81+
- [Visual C++](/implementation.md#visual_cpp): 2022 Update 14 [mark noimpl]
82+
83+
84+
## 関連項目
85+
- [`fmin`](fmin.md)
86+
- [`fminimum_num`](fminimum_num.md)
87+
88+
89+
## 参照
90+
- [P3008R6 Atomic floating-point min/max](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3008r6.html)

0 commit comments

Comments
 (0)