Skip to content

Commit

Permalink
<cstdlib> : absを追加 #1067 #1022
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed Feb 20, 2023
1 parent 0567ba8 commit 2d01c56
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 20 deletions.
2 changes: 1 addition & 1 deletion reference/cmath/abs.md
Expand Up @@ -45,7 +45,7 @@ namespace std {
## 戻り値
引数 `x` の絶対値を返す。
- (1),(2),(3) : `x` が `±∞` だった場合 `+∞` を返す。
- (1),(2),(3),(4) : `x` が `±∞` だった場合 `+∞` を返す。
## 備考
Expand Down
32 changes: 16 additions & 16 deletions reference/complex/complex/abs.md
Expand Up @@ -24,21 +24,21 @@ namespace std {
- 処理系が ISO IEC 60559 に準拠しているかどうかは、C99 の場合はマクロ `__STDC_IEC_559_COMPLEX__` が `1` に定義されている事で判別可能であるが、C++ の規格書には該当する記載を見つける事ができなかった。
- 絶対値の算出については、一部の算術型、および、[`valarray`](/reference/valarray/valarray.md) クラステンプレートに対しても、他のヘッダで定義されている。
| 引数の型 | 関数 | ヘッダ | 備考 |
|----------------------------------------------------|-----------------------------------------------|--------------------------------------|------------|
| `float` | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | |
| `double` | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | |
| `long double` | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | |
| 任意の整数型 | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | C++11 から |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | C++11 から |
| `int` | [`abs`](/reference/cstdlib/abs.md.nolink) | [`cstdlib`](/reference/cstdlib.md) | |
| `long int` | [`labs`](/reference/cstdlib/labs.md.nolink) | [`cstdlib`](/reference/cstdlib.md) | |
| | [`abs`](/reference/cstdlib/abs.md.nolink) | [`cstdlib`](/reference/cstdlib.md) | |
| `long long int` | [`llabs`](/reference/cstdlib/llabs.md.nolink) | [`cstdlib`](/reference/cstdlib.md) | C++11 から |
| | [`abs`](/reference/cstdlib/abs.md.nolink) | [`cstdlib`](/reference/cstdlib.md) | C++11 から |
| 引数の型 | 関数 | ヘッダ | 備考 |
|----------------------------------------------------|--------------------------------------|--------------------------------------|------------|
| `float` | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | |
| `double` | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | |
| `long double` | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | |
| 任意の整数型 | [`abs`](/reference/cmath/abs.md) | [`cmath`](/reference/cmath.md) | C++11 から |
| | [`fabs`](/reference/cmath/fabs.md) | [`cmath`](/reference/cmath.md) | C++11 から |
| `int` | [`abs`](/reference/cstdlib/abs.md) | [`cstdlib`](/reference/cstdlib.md) | |
| `long int` | [`labs`](/reference/cstdlib/abs.md) | [`cstdlib`](/reference/cstdlib.md) | |
| | [`abs`](/reference/cstdlib/abs.md) | [`cstdlib`](/reference/cstdlib.md) | |
| `long long int` | [`llabs`](/reference/cstdlib/abs.md) | [`cstdlib`](/reference/cstdlib.md) | C++11 から |
| | [`abs`](/reference/cstdlib/abs.md) | [`cstdlib`](/reference/cstdlib.md) | C++11 から |
| [`valarray`](/reference/valarray/valarray.md)`<T>` | [`abs`](/reference/valarray/valarray/abs.md) | [`valarray`](/reference/valarray.md) | |
なお、上記のうち、任意の整数型に対する [`abs`](/reference/cmath/abs.md) については C++11 で追加されたが、ある種の問題を引き起こすことから、今後削除される可能性がある。[Validity and return type of std::abs(0u) is unclear](http://wg21.cmeerw.net/lwg/issue2192) 参照。
Expand Down Expand Up @@ -89,4 +89,4 @@ abs( (1,2) ) = 2.23607
| [`polar`](polar.md) | 指定した絶対値と偏角の複素数値を得る。 |
| [`abs`](/reference/cmath/abs.md) | 絶対値を得る。(浮動小数点版) |
| [`fabs`](/reference/cmath/fabs.md) | 絶対値を得る。(浮動小数点版) |
| [`abs`](/reference/cstdlib/abs.md.nolink) | 絶対値を得る。(整数版) |
| [`abs`](/reference/cstdlib/abs.md) | 絶対値を得る。(整数版) |
6 changes: 3 additions & 3 deletions reference/cstdlib.md
Expand Up @@ -80,9 +80,9 @@

| 名前 | 説明 | 対応バージョン |
|------|------|----------------|
| `abs` | `int`の絶対値を取得する (function) | |
| `labs` | `long`の絶対値を取得する (function) | |
| `llabs` | `long long`の絶対値を取得する (function) | C++11 |
| [`abs`](cstdlib/abs.md) | `int`の絶対値を取得する (function) | |
| [`labs`](cstdlib/abs.md) | `long`の絶対値を取得する (function) | |
| [`llabs`](cstdlib/abs.md) | `long long`の絶対値を取得する (function) | C++11 |
| `div_t` | `div`関数の戻り値型 (class) | |
| `div` | `int`の除算を行う (function) | |
| `ldiv_t` | `div`関数の戻り値型 (class) | |
Expand Down
100 changes: 100 additions & 0 deletions reference/cstdlib/abs.md
@@ -0,0 +1,100 @@
# abs
* cstdlib[meta header]
* std[meta namespace]
* function[meta id-type]

```cpp
namespace std {
int
abs(int j); // (1) C++03
constexpr int
abs(int j); // (1) C++23

long
int abs(long j); // (2) C++03
constexpr long
int abs(long j); // (2) C++23

long long
abs(long long j); // (3) C++11
constexpr long long
abs(long long j); // (3) C++23

float
abs(float j); // (4) C++03からC++20まで
double
abs(double j); // (5) C++03からC++20まで
long double
abs(long double j); // (6) C++03からC++20まで

floating-point-type
abs(floating-point-type j); // (7) C++03からC++20まで

long
labs(long j); // (8) C++03
constexpr long
labs(long j); // (8) C++23

long long
llabs(long long j); // (9) C++11
constexpr long long
llabs(long long j); // (9) C++23
}
```
## 概要
絶対値を求める。abs は absolute value(絶対値)の略。
- (1) : `int`に対するオーバーロード
- (2) : `long`に対するオーバーロード
- (3) : `long long`に対するオーバーロード
- (4) : `float`に対するオーバーロード
- (5) : `double`に対するオーバーロード
- (6) : `long double`に対するオーバーロード
- (7) : 浮動小数点数型に対するオーバーロード
- (8) : `long`規定
- (9) : `long long`規定
## 戻り値
引数 `j` の絶対値を返す。
- (4),(5),(6),(7) : `j` が `±∞` だった場合 `+∞` を返す。
## 備考
- パラメータの型`X`において[`is_unsigned_v`](/reference/type_traits/is_unsigned.md)`<X>`が`true`であり、`X`が整数昇格によって`int`に変換できない場合、プログラムは不適格となる
- Cとの互換性のため、`int`に昇格できる符号なし整数型は許可される
- C++23では、(4)、(5)、(6)が(7)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された
## 例
```cpp example
#include <iostream>
#include <cstdlib>
int main()
{
int x = std::abs(-1);
std::cout << x << std::endl;
}
```
* std::abs[color ff0000]

### 出力
```
1
```


### 備考
特定の環境では、早期に `constexpr` 対応されている場合がある:

- GCC 4.6.1 以上


## 参照
- [P0533R9 constexpr for `<cmath>` and `<cstdlib>`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0533r9.pdf)
- C++23での、一部関数の`constexpr`対応
- [P1467R9 Extended floating-point types and standard names](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1467r9.html)
- C++23で導入された拡張浮動小数点数型への対応として、`float``double``long double`のオーバーロードを`floating-point-type`のオーバーロードに統合し、拡張浮動小数点数型も扱えるようにした

0 comments on commit 2d01c56

Please sign in to comment.