Abs
absは、多くのプログラミング言語において引数の絶対値を返す関数である。言語によって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 x_abs = abs(x);
printf("%dの絶対値は%d\n", x, x_abs);
return 0;
}
出力結果
-5の絶対値は5
なお、符号付整数型に2の補数が用いる処理系でabs(INT_MIN)を行う場合など、結果が表現できない場合の動作はC言語の仕様上は未定義であるが、通常の実装は元の値をそのまま返し、正の数になっていない。
absの種類
CやC++の場合も同様に引数の型によって名前が変わる。ただしC++ではabsがそれぞれの型に対して多重定義されているので、型の区別なく使用することもできる。
- abs - int (整数型)
- labs - long (長整数型)
- llabs - long long (長々整数型) *
- imaxabs - intmax_t (処理系が扱える最大の整数型) *
- fabs - double (浮動小数点数型)
- fabsf - float (〃) *
- fabsl - long double (〃) *
- cabs - double complex (複素数型/C99) *
- cabsf - float complex (〃) *
- cabsl - long double complex (〃) *
- abs - complex<T> (複素数型/C++)
- abs - valarray<T> (ベクトル演算/C++)
*印があるものはC99より導入された。浮動小数点数型の関数は<math.h>および<cmath>、C99の複素数型の関数は<complex.h> 、C++の複素数型の関数は<complex>、valarray<T>型の関数は<valarray>にて宣言されている。
実装例
absを自前で定義したい場合は以下のように実施する。
int my_abs(int i)
{
if (i < 0)
return -i;
else
return i;
}
もしくは、マクロを用いればC言語でも型を気にせずに用いることが可能となる。しかし副作用に注意する必要性が生じる。
#define my_abs(x) ((x) >= 0 ? (x) : -(x))
Java
java.lang.Math.abs() にて実装されている。引数は int, long, float, double で多重定義されている。int, long の負数の最小値を引数に与えると同じ値をそのまま返すと規定されている。