コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Abs」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m C/C++: 外部リンクURLの変更
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
5行目: 5行目:
== C/C++ ==
== C/C++ ==
[[C言語|C]]/[[C++]]では[[ヘッダーファイル]]<stdlib.h>および<cstdlib>の中で、次のように関数absが[[プロトタイプ宣言|宣言]]されている。ただし、後述するようにこれ以外にもいくつか種類が存在する。
[[C言語|C]]/[[C++]]では[[ヘッダーファイル]]<stdlib.h>および<cstdlib>の中で、次のように関数absが[[プロトタイプ宣言|宣言]]されている。ただし、後述するようにこれ以外にもいくつか種類が存在する。
<source lang="c">
<syntaxhighlight lang="c">
int abs(int);
int abs(int);
</syntaxhighlight>
</source>
そして、例えば次のように使用できる。
そして、例えば次のように使用できる。
<source lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
19行目: 19行目:
return 0;
return 0;
}
}
</syntaxhighlight>
</source>
出力結果:
出力結果:
<source lang="text">
<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関数の典型的な実装例は以下である。
<source lang="c">
<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言語でも型を気にせずに用いることが可能となる。しかし[[副作用 (プログラム)|副作用]]に注意する必要性が生じる。
<source lang="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> C99C++11で標準化。
imaxabs intmax_t処理系が扱える最大の整数型) <stdlib.h>, <cstdlib> C99C++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 例外がスローされる。

脚注

外部リンク