「Abs」の版間の差分
m →C/C++: 外部リンクURLの変更 |
|||
5行目: | 5行目: | ||
== C/C++ == |
== C/C++ == |
||
[[C言語|C]]/[[C++]]では[[ヘッダーファイル]]<stdlib.h>および<cstdlib>の中で、次のように関数absが[[プロトタイプ宣言|宣言]]されている。ただし、後述するようにこれ以外にもいくつか種類が存在する。 |
[[C言語|C]]/[[C++]]では[[ヘッダーファイル]]<stdlib.h>および<cstdlib>の中で、次のように関数absが[[プロトタイプ宣言|宣言]]されている。ただし、後述するようにこれ以外にもいくつか種類が存在する。 |
||
< |
<syntaxhighlight lang="c"> |
||
int abs(int); |
int abs(int); |
||
</syntaxhighlight> |
|||
</source> |
|||
そして、例えば次のように使用できる。 |
そして、例えば次のように使用できる。 |
||
< |
<syntaxhighlight lang="c"> |
||
#include <stdio.h> |
#include <stdio.h> |
||
#include <stdlib.h> |
#include <stdlib.h> |
||
19行目: | 19行目: | ||
return 0; |
return 0; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
出力結果: |
出力結果: |
||
< |
<syntaxhighlight lang="text"> |
||
-5の絶対値は5 |
-5の絶対値は5 |
||
</syntaxhighlight> |
|||
</source> |
|||
なお、符号付整数型に[[2の補数]]を用いる処理系で<code>abs(INT_MIN)</code>を実行する場合など、結果が表現できない場合の動作はC言語の仕様上は未定義である<ref>[https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?show&jisStdNo=X3010 JISC 日本工業標準調査会 JIS X3010 プログラム言語C]。</ref>が、[[GNUコンパイラコレクション|GCC]]などの典型的な実装では(絶対値ではない)元の値をそのまま返す。 |
なお、符号付整数型に[[2の補数]]を用いる処理系で<code>abs(INT_MIN)</code>を実行する場合など、結果が表現できない場合の動作はC言語の仕様上は未定義である<ref>[https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?show&jisStdNo=X3010 JISC 日本工業標準調査会 JIS X3010 プログラム言語C]。</ref>が、[[GNUコンパイラコレクション|GCC]]などの典型的な実装では(絶対値ではない)元の値をそのまま返す。 |
||
60行目: | 60行目: | ||
=== 実装例 === |
=== 実装例 === |
||
C言語におけるabs関数の典型的な実装例は以下である。 |
C言語におけるabs関数の典型的な実装例は以下である。 |
||
< |
<syntaxhighlight lang="c"> |
||
int my_abs(int x) { |
int my_abs(int x) { |
||
if (x < 0) |
if (x < 0) |
||
67行目: | 67行目: | ||
return x; |
return x; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
もしくは、[[マクロ (コンピュータ用語)|マクロ]]を用いればC言語でも型を気にせずに用いることが可能となる。しかし[[副作用 (プログラム)|副作用]]に注意する必要性が生じる。 |
もしくは、[[マクロ (コンピュータ用語)|マクロ]]を用いればC言語でも型を気にせずに用いることが可能となる。しかし[[副作用 (プログラム)|副作用]]に注意する必要性が生じる。 |
||
< |
<syntaxhighlight lang="c"> |
||
#define my_abs(x) ((x) >= 0 ? (x) : -(x)) |
#define my_abs(x) ((x) >= 0 ? (x) : -(x)) |
||
</syntaxhighlight> |
|||
</source> |
|||
C99では[[ジェネリックプログラミング|ジェネリック]]版のfabs関数が<tgmath.h>に宣言されている。 |
C99では[[ジェネリックプログラミング|ジェネリック]]版のfabs関数が<tgmath.h>に宣言されている。 |
||
2020年7月5日 (日) 22:43時点における版
absは、多くのプログラミング言語において引数の絶対値 (absolute value) を返す関数である。言語によってabs, Abs, ABSなどと大文字小文字に揺れがあったり、多少の修飾辞を伴っていたりする場合もある。例えばFortranの場合、引数の型によってABS, IABSなど、異なる名前の関数が用意されている。
C/C++
C/C++ではヘッダーファイル<stdlib.h>および<cstdlib>の中で、次のように関数absが宣言されている。ただし、後述するようにこれ以外にもいくつか種類が存在する。
int abs(int);
そして、例えば次のように使用できる。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x = -5;
int abs_x = abs(x);
printf("%dの絶対値は%d\n", x, abs_x);
return 0;
}
出力結果:
-5の絶対値は5
なお、符号付整数型に2の補数を用いる処理系でabs(INT_MIN)
を実行する場合など、結果が表現できない場合の動作はC言語の仕様上は未定義である[1]が、GCCなどの典型的な実装では(絶対値ではない)元の値をそのまま返す。
absの種類
C/C++の場合、Fortran同様に引数の型によって異なる名前の関数が用意されている。ただしC++ではabs
がそれぞれの型に対して多重定義されているので、異なる型に対して一律abs
を使用することもできる。
関数名 | 型 | 宣言ヘッダー | 備考 |
---|---|---|---|
abs |
int (整数型) |
<stdlib.h>, <cstdlib> | |
labs |
long (長整数型) |
<stdlib.h>, <cstdlib> | |
llabs |
long long (長々整数型) |
<stdlib.h>, <cstdlib> | C99、C++11で標準化。 |
imaxabs |
intmax_t (処理系が扱える最大の整数型) |
<stdlib.h>, <cstdlib> | C99、C++11で標準化。 |
fabs |
double (倍精度浮動小数点数型) |
<math.h>, <cmath> | |
fabsf |
float (単精度浮動小数点数型) |
<math.h> | C99で標準化。 |
fabsl |
long double (拡張倍精度浮動小数点数型) |
<math.h> | C99で標準化。 |
cabs |
double complex (倍精度複素数型、C99のみ) |
<complex.h> | C99で標準化。 |
cabsf |
float complex (単精度複素数型、C99のみ) |
<complex.h> | C99で標準化。 |
cabsl |
long double complex (拡張倍精度複素数型、C99のみ) |
<complex.h> | C99で標準化。 |
abs |
complex<T> (複素数型テンプレート、C++のみ) |
<complex> | |
abs |
valarray<T> (ベクトル演算対応配列型テンプレート、C++のみ) |
<valarray> |
実装例
C言語におけるabs関数の典型的な実装例は以下である。
int my_abs(int x) {
if (x < 0)
return -x;
else
return x;
}
もしくは、マクロを用いればC言語でも型を気にせずに用いることが可能となる。しかし副作用に注意する必要性が生じる。
#define my_abs(x) ((x) >= 0 ? (x) : -(x))
C99ではジェネリック版のfabs関数が<tgmath.h>に宣言されている。
Java
java.lang.Math.abs() にて実装されている。int, long, float, double 用に多重定義されている。int, long の負数の最小値を引数に与えると同じ値をそのまま返すと規定されている。
.NET
C#を始めとする.NET Frameworkに対応した言語では、System.Math.Abs() にて実装されている。System.SByte, System.Int16, System.Int32, System.Int64, System.Decimal, System.Single, System.Double 用に多重定義されている。SByte.MinValue, Int16.MinValue, Int32.MinValue, Int64.MinValue をそれぞれのメソッドオーバーロードに渡すと System.OverflowException 例外がスローされる。
脚注
外部リンク
abs(3)
– JM Project Linux Library Functions マニュアル