【2026年7月最新】C言語で絶対値を求める方法完全ガイド|abs・labs・fabs・fabsf関数の使い分けと実践コード例
この記事の内容
C言語で絶対値を求めたいとき、どの関数を使えばよいか迷ったことはありませんか?「abs関数があるのは知っているが、float型に使ったら正しく動かなかった」「math.hをインクルードしていないのにfabsを呼んでも動く気がする…」——こうした疑問は、C言語初学者だけでなく、中級者にとっても意外に多い落とし穴です。
C言語には絶対値を求める関数が複数存在します。それぞれがどのデータ型に対して動作するかを理解していないと、型の不一致による未定義動作や精度の欠損が起きます。「動いているように見えてバグが潜んでいる」状態が最も危険で、特に組み込み開発や数値計算では深刻な問題に発展することがあります。
この記事では、C言語の絶対値関数をデータ型ごとに体系的に解説します。abs・labs・llabs・fabs・fabsfの5関数の違いを完全に整理したうえで、if-else文やマクロによる自作実装まで網羅します。コード例はすべてコンパイルできる完全なサンプルです。
01 BASICS C言語における絶対値とは 数学的定義からプログラミングへの対応まで
絶対値(Absolute Value)とは、数値の「符号を取り除いた大きさ」を指します。数学では |x| という記法で表し、x が正の場合はそのまま x、負の場合は -x、0 の場合は 0 を返します。この概念はC言語でも同様ですが、プログラミングにおいてはデータ型に応じた専用の関数を使い分ける必要があります。
たとえば、数学では |−5.5| = 5.5 は自明ですが、C言語の abs(-5.5) は整数部しか処理できないため、内部で float が int に変換され 5 になってしまいます。これは「コンパイルエラーにはならないが、意図した結果にならない」典型的な罠です。
📚 用語解説
絶対値(Absolute Value):数直線上での原点(0)からの距離を表す値。正の数はそのまま、負の数は符号を反転させた値となる。数学記法では |x| で表され、常に0以上の値を返す。C言語では型に応じた専用関数(abs/labs/fabs等)を使って求める。
📚 用語解説
ヘッダファイル(Header File):C言語で標準ライブラリの関数を使用するために先頭で読み込む宣言ファイル。拡張子は .h。#include
C言語の絶対値関数は、使用するヘッダファイルとデータ型の対応関係を正確に把握することが重要です。以下のフロー図でまずは全体像を掴みましょう。
また、C言語ではヘッダファイルのインクルード忘れがよくある問題です。整数向けのabs/labs/llabasは <stdlib.h> をインクルードして使います。浮動小数点向けのfabs/fabsfは <math.h> が必要です。この使い分けがミスの原因になりやすいため、本記事でしっかり解説します。
C99規格からは <stdlib.h> のabs関数がlong int引数に対してlabs相当の動作をする処理系もありますが、移植性のあるコードを書くためには常に型に合った専用関数を明示的に使うことを推奨します。コンパイラや環境依存に頼るのは避けましょう。
絶対値の計算が必要なユースケースは非常に多くあります。たとえば、2点間の距離計算、誤差の評価、データの正規化、グラフィックスでの座標計算、音声信号処理など、科学技術計算から組み込み系まで幅広い場面で登場します。そのため、正確な関数選択は実務上の重要スキルです。
02 INT TYPE abs関数の使い方(int型) stdlib.hをインクルードしてint型の絶対値を取得する
abs関数はC言語で最もよく使われる絶対値関数です。int型(整数型)の絶対値を求めるために設計されており、<stdlib.h> をインクルードすることで使えます。関数のシグネチャは int abs(int x); です。引数も戻り値も int 型であることに注意してください。
📚 用語解説
stdlib.h:Standard Library の略。C言語の標準ライブラリヘッダの一つで、メモリ管理(malloc/free)、文字列変換(atoi/strtol)、乱数(rand)、プロセス制御(exit)、絶対値(abs/labs/llabs)などの汎用ユーティリティ関数が宣言されている。ほぼすべてのC言語プログラムで使用される基本ヘッダ。
📚 用語解説
int型:C言語の基本整数型。多くの環境では32ビット符号付き整数で、格納できる範囲は -2,147,483,648 〜 2,147,483,647。abs()関数はこの範囲の整数の絶対値を正確に求める。ただし INT_MIN(-2147483648)の絶対値は同型で表現できないため、この値をabs()に渡すと未定義動作になる点に注意が必要。
以下は abs 関数の基本的な使い方を示す完全なサンプルプログラムです。
#include <stdio.h>
#include <stdlib.h> /* abs() を使うために必要 */
int main(void) {
int a = -42;
int b = 100;
int c = 0;
printf("abs(%d) = %d\n", a, abs(a)); /* abs(-42) = 42 */
printf("abs(%d) = %d\n", b, abs(b)); /* abs(100) = 100 */
printf("abs(%d) = %d\n", c, abs(c)); /* abs(0) = 0 */
/* 差分の絶対値を求める例(距離計算) */
int x1 = 5, x2 = -3;
int distance = abs(x1 - x2);
printf("x1=%d と x2=%d の距離: %d\n", x1, x2, distance); /* 8 */
return 0;
}
このプログラムをコンパイルして実行すると、以下の出力が得られます。
abs(-42) = 42
abs(100) = 100
abs(0) = 0
x1=5 と x2=-3 の距離: 8
abs(-3.14) のようにfloat/double型の値をabs()に渡すと、暗黙の型変換によってfloatの小数部が切り捨てられてintになってから処理されます。abs(-3.14)は3を返し、小数点以下の情報が完全に失われます。コンパイル時に警告が出る場合もありますが、警告なしで通るケースもあるため注意が必要です。float/doubleにはfabs()/fabsf()を使いましょう。
abs関数を実際の計算に使う場面をいくつか確認しましょう。数値の差の絶対値を使った誤差チェック、配列要素の正規化など、実務で頻繁に使うパターンです。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
/* 誤差チェック: 期待値と実測値の差が許容範囲内かどうか */
int expected = 100;
int actual = 97;
int tolerance = 5;
if (abs(expected - actual) <= tolerance) {
printf("許容範囲内: 差=%d\n", abs(expected - actual));
} else {
printf("許容範囲外: 差=%d\n", abs(expected - actual));
}
/* 配列の各要素の絶対値を求める */
int arr[] = {-10, 3, -7, 0, 15, -2};
int n = sizeof(arr) / sizeof(arr[0]);
printf("絶対値の配列: ");
for (int i = 0; i < n; i++) {
printf("%d ", abs(arr[i]));
}
printf("\n");
return 0;
}
abs()の戻り値はint型です。long型やlong long型の値を扱いたい場合は戻り値の型も一致していないと、大きな数値で正しく動作しません。int型の最大値(2147483647)を超える数を扱う場合は後述のlabs()/llabs()を使いましょう。
03 LONG TYPE labs・llabs関数(long/long long型) 大きな整数値の絶対値を正確に求める方法
int型の範囲(約±21億)を超える整数値を扱う場合は、labs(long型用)またはllabs(long long型用)を使う必要があります。どちらも <stdlib.h> に含まれており、abs と同様にインクルードするだけで使用できます。
📚 用語解説
long型:C言語の拡張整数型。32ビット環境では int と同じ32ビット幅のこともあるが、64ビット Linux/macOS環境ではlong型は64ビット(-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807)となる。Windowsの64ビット環境ではlong型は32ビットのまま。この環境依存性のため、大きな整数にはlong longを使うことが推奨される。labs()はこのlong型の絶対値を返す関数。
以下にlabs・llaabs両関数の実践的なサンプルを示します。
#include <stdio.h>
#include <stdlib.h> /* labs(), llabs() を使うために必要 */
int main(void) {
long a = -1234567890L;
long b = 9876543210L;
printf("labs(%ld) = %ld\n", a, labs(a)); /* 1234567890 */
printf("labs(%ld) = %ld\n", b, labs(b)); /* 9876543210 */
long long c = -9876543210123LL;
long long d = 1000000000000LL;
printf("llabs(%lld) = %lld\n", c, llabs(c)); /* 9876543210123 */
printf("llabs(%lld) = %lld\n", d, llabs(d)); /* 1000000000000 */
/* long long型での差分絶対値計算(大きなファイルサイズ比較等に有用) */
long long file1_size = 5368709120LL; /* 5GB */
long long file2_size = 3221225472LL; /* 3GB */
long long diff = llabs(file1_size - file2_size);
printf("ファイルサイズ差: %lld バイト\n", diff); /* 2147483648 */
return 0;
}
labs とllabs の使い分けは、変数の型に完全に一致させることが重要です。型が一致していないと、暗黙の型変換が行われて計算精度が失われる可能性があります。以下のフロー図で整数型の関数選択を整理しましょう。
long型のビット幅は処理系・プラットフォームによって異なります。Windowsの64ビット環境ではlong型は32ビット(intと同じ幅)ですが、64ビットのLinux・macOS環境では64ビットです。この違いを無視すると、long型に大きな値を代入したつもりがオーバーフローする可能性があります。移植性を重視するコードでは、<stdint.h>のint32_t・int64_tを使い、対応するabs関数はimaxabs(<inttypes.h>)を検討してください。
04 FLOAT TYPE fabs・fabsf関数(double/float型) 浮動小数点数の絶対値はmath.hの関数を使う
浮動小数点数(小数を含む実数)の絶対値を求める際は、fabs(double型用)またはfabsf(float型用)を使います。これらは <math.h> に宣言されており、コンパイル時には -lm オプションでの数学ライブラリのリンクが必要な環境があります。
📚 用語解説
double型:C言語の倍精度浮動小数点型。IEEE 754規格に基づく64ビットの浮動小数点数。精度は約15〜16桁の有効数字。C言語において浮動小数点リテラルのデフォルト型はdoubleであり、3.14や2.71828などは自動的にdouble型として扱われる。科学技術計算、金融計算など高精度が必要な場面で使用される。fabs()はdouble型の絶対値を返す関数。
📚 用語解説
float型:C言語の単精度浮動小数点型。IEEE 754規格に基づく32ビットの浮動小数点数。精度は約6〜7桁の有効数字。doubleより精度は低いが、メモリ使用量が半分で処理が高速なため、組み込みシステムやグラフィックス処理(3D計算等)では多用される。float型リテラルを示すには 3.14f のように末尾にfをつける。fabsf()はfloat型の絶対値を返す関数。
📚 用語解説
math.h:C言語の数学ライブラリヘッダ。sin/cos/tan(三角関数)、sqrt(平方根)、pow(べき乗)、log(対数)、fabs/fabsf(絶対値)など、数学的な計算関数が宣言されている。#include <math.h>でインクルードして使う。GCC等の環境ではコンパイル時に-lmオプションを追加して数学ライブラリをリンクする必要がある場合がある。
以下のサンプルでは fabs と fabsf の両方を実際に使い、double型とfloat型それぞれで絶対値を計算する方法を示します。
#include <stdio.h>
#include <math.h> /* fabs(), fabsf() を使うために必要 */
int main(void) {
/* double型の絶対値: fabs() */
double d1 = -3.141592653589793;
double d2 = 2.718281828459045;
double d3 = -0.0;
printf("fabs(%f) = %f\n", d1, fabs(d1)); /* 3.141593 */
printf("fabs(%f) = %f\n", d2, fabs(d2)); /* 2.718282 */
printf("fabs(%f) = %f\n", d3, fabs(d3)); /* 0.000000 */
/* float型の絶対値: fabsf() */
float f1 = -1.5f;
float f2 = 0.001f;
float f3 = -100.0f;
printf("fabsf(%f) = %f\n", f1, fabsf(f1)); /* 1.500000 */
printf("fabsf(%f) = %f\n", f2, fabsf(f2)); /* 0.001000 */
printf("fabsf(%f) = %f\n", f3, fabsf(f3)); /* 100.000000 */
/* 誤差の絶対値チェック(数値計算での典型的な使用例) */
double expected = 1.0 / 3.0;
double computed = 0.333333;
double error = fabs(expected - computed);
printf("誤差の絶対値: %e\n", error);
return 0;
}
GCC(Linux/macOS環境)では、math.hの関数を使うためにコンパイル時に -lm オプションを追加する必要があります。gcc myprogram.c -o myprogram -lm のように記述します。このオプションを忘れると「undefined reference to `fabs'」のようなリンクエラーが発生します。一方、Windowsの多くの開発環境(MinGW, Visual Studio等)では -lm が不要な場合もあります。
C99規格以降では <tgmath.h>(type-generic math)をインクルードすることで、引数の型に応じてfabs/fabsf/fabslを自動選択するマクロとして abs/fabs を使えます。移植性の高いコードを書く場合、C99以降の環境限定ならtgmath.hも選択肢になります。ただしC++ではオーバーロードが使えるため、std::absだけで全型に対応できます。
05 SELECTION GUIDE データ型別の関数選択ガイド 型を見た瞬間に正しい関数が選べるようになる
C言語の絶対値関数は5種類(abs・labs・llabs・fabs・fabsf)あり、それぞれが特定のデータ型に対して最適化されています。以下の意思決定フローを参考に、コード中の変数の型に応じた正しい関数を選んでください。
より詳細な情報を以下の比較表にまとめました。ヘッダファイル、引数型、戻り値型、コンパイルオプションの4点を一覧できます。
| 関数名 | 対象型 | 引数型 | 戻り値型 | ヘッダ | コンパイルオプション |
|---|---|---|---|---|---|
| abs() | int型整数 | int | int | <stdlib.h> |
不要 |
| labs() | long型整数 | long | long | <stdlib.h> |
不要 |
| llabs() | long long型整数 | long long | long long | <stdlib.h> |
不要(C99以降) |
| fabs() | double型実数 | double | double | <math.h> |
-lm(環境依存) |
| fabsf() | float型実数 | float | float | <math.h> |
-lm(環境依存) |
C11規格以降では _Generic 構文を使って型に応じた関数を自動選択するマクロを自作できます。たとえば #define ABS(x) _Generic((x), int: abs, long: labs, long long: llabs, float: fabsf, double: fabs)(x) のように定義すると、型に関わらず ABS(x) で呼び出せます。ただし可読性が下がるため、チームの方針に合わせて判断してください。
06 CUSTOM IMPL if-else・三項演算子で自作する方法 標準関数を使わずに絶対値を実装するパターン集
標準ライブラリの絶対値関数を使わず、自前で実装するパターンを学ぶことは、C言語の制御構文を深く理解するうえで非常に有益です。また、組み込み開発など標準ライブラリが使えない環境や、インライン展開による最適化が必要な場面でも役立ちます。ここでは3種類の実装方法を紹介します。
パターン1:if-else文による実装が最もわかりやすい基本実装です。条件分岐を明示的に書くため、コードの意図がはっきり伝わります。
#include <stdio.h>
/* if-else で絶対値を求める関数 */
int my_abs_int(int x) {
if (x < 0) {
return -x;
} else {
return x;
}
}
double my_abs_double(double x) {
if (x < 0.0) {
return -x;
} else {
return x;
}
}
int main(void) {
printf("my_abs_int(-7) = %d\n", my_abs_int(-7)); /* 7 */
printf("my_abs_int(3) = %d\n", my_abs_int(3)); /* 3 */
printf("my_abs_double(-2.5) = %f\n", my_abs_double(-2.5)); /* 2.5 */
return 0;
}
パターン2:三項演算子(条件演算子)による実装です。if-elseをより簡潔に1行で書けます。数式のように読めるため、慣れた開発者には好まれる書き方です。
#include <stdio.h>
/* 三項演算子で絶対値を求める */
int my_abs_ternary(int x) {
return (x < 0) ? -x : x;
}
double my_fabs_ternary(double x) {
return (x < 0.0) ? -x : x;
}
int main(void) {
int values[] = {-5, 0, 3, -100, 42};
int n = sizeof(values) / sizeof(values[0]);
printf("三項演算子による絶対値:\n");
for (int i = 0; i < n; i++) {
printf(" %4d -> %4d\n", values[i], my_abs_ternary(values[i]));
}
printf("double版: %.3f\n", my_fabs_ternary(-3.14)); /* 3.140 */
return 0;
}
パターン3:マクロ(#define)による実装です。関数呼び出しのオーバーヘッドがなく、型に依存しない汎用性があります。ただし副作用のある式を渡すと問題が起きるため、使い方には注意が必要です。
#include <stdio.h>
/* マクロによる絶対値の定義 */
#define MY_ABS(x) ((x) < 0 ? -(x) : (x))
int main(void) {
int i = -10;
float f = -3.14f;
double d = -2.718;
/* どの型でも使用可能(型変換は呼び出し側の責任) */
printf("MY_ABS(%d) = %d\n", i, MY_ABS(i)); /* 10 */
printf("MY_ABS(%f) = %f\n", f, MY_ABS(f)); /* 3.140000 */
printf("MY_ABS(%lf) = %lf\n", d, MY_ABS(d)); /* 2.718000 */
return 0;
}
MY_ABS(i++) のようにインクリメント演算子を含む式を渡すと、マクロ展開後に ((i++) < 0 ? -(i++) : (i++)) になります。i の評価が2回行われるため、意図しない結果になります。この問題を避けるには、マクロに渡す前に変数に一度代入するか、インライン関数(C99以降)を使いましょう。static inline int my_abs(int x) { return x < 0 ? -x : x; } のようにすれば副作用の問題を回避できます。
C99以降では static inline キーワードを使ったインライン関数を定義できます。マクロと同様に関数呼び出しのオーバーヘッドを抑えつつ、型安全性と副作用の問題を解決できます。組み込み系での自作実装においては、マクロよりもインライン関数のほうが安全で推奨されます。
07 COMMON ERRORS よくある間違いとエラー 型ミスマッチ・ヘッダ忘れ・未定義動作の回避法
C言語の絶対値関数に関連してよく見られる間違いとエラーをまとめます。コンパイルエラーになるケースも、警告なしにバグが生じるケースも、どちらも重要です。
abs(-3.14) のようにfloat/double値をabs()に渡すと、暗黙型変換でintになり小数部が失われます。コンパイラによっては警告を出しますが、エラーにはなりません。-3.14の絶対値として3が返るため、計算上の誤差が発生します。正解:fabs(-3.14) または fabsf(-3.14f) を使う。
math.hをインクルードせずにfabs()を呼び出すと、コンパイラによっては「暗黙の関数宣言」として扱われ、戻り値がint型と解釈されます。結果として浮動小数点数を正しく扱えず、誤った値が返ることがあります。C99以降では暗黙の関数宣言はコンパイルエラーになる場合もあります。正解:必ず #include
以下のコードで「間違った実装」と「正しい実装」を比較してみましょう。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void) {
double x = -3.14;
float y = -2.5f;
/* 間違い: abs()をfloat/doubleに使う */
/* int result_wrong = abs(x); */ /* 3 になってしまう(小数部損失) */
/* 正しい: 型に合った関数を使う */
double result_d = fabs(x); /* 3.14 */
float result_f = fabsf(y); /* 2.5 */
printf("fabs(%f) = %f\n", x, result_d); /* 3.140000 */
printf("fabsf(%f) = %f\n", y, result_f); /* 2.500000 */
/* 間違い: labs()にint値を渡す(型の不一致、警告が出る場合も) */
int a = -100;
/* long result_wrong2 = labs(a); */ /* 動くが暗黙変換あり */
/* 正しい: intにはabs()を使う */
int result_i = abs(a); /* 100 */
printf("abs(%d) = %d\n", a, result_i);
return 0;
}
08 FAQ よくある質問 C言語の絶対値についてよく寄せられる疑問に答える
C言語の絶対値関数についてよく寄せられる質問をまとめます。
Q1. abs()とfabs()の違いは何ですか?
A. 扱うデータ型が異なります。abs()はint型(整数)用、fabs()はdouble型(浮動小数点数)用の絶対値関数です。abs()に浮動小数点数を渡すと小数部が切り捨てられてしまいます。使用するヘッダファイルも異なり、abs()は<stdlib.h>、fabs()は<math.h>です。変数の型を確認して正しい関数を選ぶことが重要です。
Q2. fabsとfabsfのどちらを使えばよいですか?
A. 変数の型に合わせて選びます。double型の変数にはfabs()、float型の変数にはfabsf()を使います。float型の変数にfabs()を使うと、引数がdoubleに昇格して計算され、その後floatに戻されるため、処理は正しく行われますが、型変換のオーバーヘッドが発生します。厳密なfloat型の計算が必要な組み込み環境ではfabsf()を明示的に使うことを推奨します。
Q3. math.hをインクルードしなくてもfabsが動くことがありますが、なぜですか?
A. コンパイラや環境によっては、他のヘッダファイルが間接的にmath.hの内容を取り込むことがあります。また、古いC規格(C89以前)では暗黙の関数宣言が許可されていたため、インクルードなしで動いてしまうケースがありました。しかしこれは移植性のない偶然の動作です。C99以降では暗黙の宣言はエラーまたは警告になります。必ず明示的に#include <math.h>を記述してください。
Q4. C++でC言語の絶対値関数を使えますか?
A. C++では<cstdlib>・<cmath>をインクルードすることで同様の関数が使えます。さらにC++ではstd::absがオーバーロードされており、int/long/long long/float/double/long doubleのすべてに対して正しく動作します。C++を使う場合は#include <cmath>とstd::abs(x)を使うと型に応じて自動選択されるため便利です。C言語での明示的な型別関数選択は不要になります。
Q5. -lmオプションとは何ですか?どんな環境で必要ですか?
A. -lmはGCCでコンパイルする際に数学ライブラリ(libm)をリンクするオプションです。LinuxやmacOS上でGCCを使ってfabs()などのmath.h関数を含むプログラムをコンパイルするときに必要です(例:gcc myfile.c -o myfile -lm)。一方、Windows上のMinGWやVisual Studioではlibmがデフォルトでリンクされるため、-lmオプションが不要なことがほとんどです。「undefined reference to `fabs'」というエラーが出たら、-lmの追加で解決します。
09 SUMMARY まとめ — C言語の絶対値関数を完全マスター 型を見て即座に正しい関数を選べるようになろう
この記事では、C言語で絶対値を求めるための全関数を徹底解説しました。abs・labs・llabs・fabs・fabsfの5関数は、それぞれ扱うデータ型が異なります。型に合った関数を使うことがバグのないC言語プログラムを書くための基本です。
C言語を含むプログラミングのスキルを業務効率化につなげたい方、AIを活用して開発生産性を上げたい方は、AI鬼管理の無料相談をお気軽にご利用ください。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。



