abs

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を使用することもできる。

関数名宣言ヘッダー備考
absint整数型<stdlib.h>, <cstdlib>
labslong(長整数型)<stdlib.h>, <cstdlib>
llabslong long(長々整数型)<stdlib.h>, <cstdlib>C99C++11で標準化。
imaxabsintmax_t処理系が扱える最大の整数型)<stdlib.h>, <cstdlib>C99C++11で標準化。
fabsdouble倍精度浮動小数点数型)<math.h>, <cmath>
fabsffloat単精度浮動小数点数型)<math.h>C99で標準化。
fabsllong double拡張倍精度浮動小数点数型)<math.h>C99で標準化。
cabsdouble complex(倍精度複素数型、C99のみ)<complex.h>C99で標準化。
cabsffloat complex(単精度複素数型、C99のみ)<complex.h>C99で標準化。
cabsllong double complex(拡張倍精度複素数型、C99のみ)<complex.h>C99で標準化。
abscomplex<T>(複素数型テンプレート、C++のみ)<complex>
absvalarray<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 例外がスローされる。

脚注

外部リンク

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.