C言語で絶対値を計算する:fabs() 関数とその他の方法

2024-04-02

C言語 Numerics fabs() 関数詳細解説

概要:

  • double fabs(double x);
  • double fabs(float x);
  • long double fabsl(long double x);

引数:

  • x: 浮動小数点数

戻り値:

  • x の絶対値

動作:

  • x が正の場合、x をそのまま返します。
  • x が負の場合、x の符号を変えて返します。
  • x が 0 の場合、0 を返します。

:

#include <stdio.h>

int main() {
  double x = -3.1415926535;
  double abs_x = fabs(x);

  printf("x = %f\n", x);
  printf("fabs(x) = %f\n", abs_x);

  return 0;
}

出力:

x = -3.1415926535
fabs(x) = 3.1415926535

関連関数:

  • fabsf(): float 型の浮動小数点数の絶対値を計算します。
  • fabsl(): long double 型の浮動小数点数の絶対値を計算します。

注意事項:

  • fabs(), fabsf(), fabsl() は、C99 で導入された関数です。
  • C89 では、fabs()double 型のみをサポートします。

補足:

  • fabsd64() は、fabs() の 64 ビット版です。
  • fabs() は、x が負の場合、2 の補数表現を用いて符号を反転します。


fabs() 関数のサンプルコード

#include <stdio.h>

int main() {
  double x = -3.1415926535;
  double abs_x = fabs(x);

  printf("x = %f\n", x);
  printf("fabs(x) = %f\n", abs_x);

  return 0;
}

出力:

x = -3.1415926535
fabs(x) = 3.1415926535

配列の要素の絶対値を計算する

#include <stdio.h>

int main() {
  double data[] = {-1.2, 3.4, -5.6, 7.8};
  int i;

  for (i = 0; i < 4; i++) {
    printf("data[%d] = %f\n", i, fabs(data[i]));
  }

  return 0;
}

出力:

data[0] = 1.200000
data[1] = 3.400000
data[2] = 5.600000
data[3] = 7.800000

条件分岐に利用する

#include <stdio.h>

int main() {
  double x = -2.5;

  if (fabs(x) < 1.0) {
    printf("x は 1 より小さい\n");
  } else {
    printf("x は 1 より大きい\n");
  }

  return 0;
}

出力:

x は 1 より小さい

誤差の計算に利用する

#include <stdio.h>

int main() {
  double a = 1.2345678901234567;
  double b = 1.2345678901234568;
  double error = fabs(a - b);

  printf("error = %f\n", error);

  return 0;
}

出力:

error = 0.0000000000000000

数学関数との組み合わせ

#include <stdio.h>
#include <math.h>

int main() {
  double x = -2.0;
  double y = sqrt(fabs(x));

  printf("y = %f\n", y);

  return 0;
}

出力:

y = 1.4142135623730951


fabs() 関数以外の方法

条件分岐

double absolute_value(double x) {
  if (x >= 0) {
    return x;
  } else {
    return -x;
  }
}

ビット演算

double absolute_value(double x) {
  uint64_t u = *(uint64_t *)&x;
  u &= 0x7FFFFFFFFFFFFFFF;
  return *(double *)&u;
}

マクロ

#define ABS(x) ((x) >= 0 ? (x) : -(x))

double absolute_value(double x) {
  return ABS(x);
}

各方法の比較

方法メリットデメリット
fabs() 関数最も簡潔で分かりやすいC89 では double 型のみ
条件分岐汎用性が高い少し冗長
ビット演算高速に実行できる移植性が低い
マクロ簡潔に記述できるマクロの使い過ぎはコードの可読性を低下させる



C言語とFortran:メモリ管理、処理速度、並列処理の比較

C言語とFortranには、多くの共通するキーワードがあります。以下に、いくつかの例を示します。制御構文: if else for while do endifelseforwhiledoendデータ型: integer real character logical



typeof_unqual の代替方法:型キャスト、マクロ、C++ の std::decay

C言語における typeof_unqual キーワードは、オペランドの型を 修飾子なしの型名 で取得するために使用されます。これは、型推論やジェネリックプログラミングなどの高度なプログラミング技法を可能にする強力なツールです。typeof_unqual の役割


マルチスレッドプログラミングにおけるメモリモデル:競合状態を防ぎ、共有メモリを安全に使用するための秘訣

C言語のメモリモデルは、以下の理由で重要です。プログラムの動作を予測可能にする: メモリモデルは、プログラムがメモリにアクセスし、データを書き込む方法を定義することで、プログラムの動作を予測可能にします。これは、マルチスレッドプログラムで競合状態を回避したり、共有メモリを安全に使用したりするのに役立ちます。


C言語プログラマーなら知っておきたい!暗黙の型変換の落とし穴と回避策

C言語における主な暗黙の型変換は以下の通りです。昇格変換: 小さい型の値を、より大きな型の値に変換します。例えば、char 型の値を int 型に変換します。降格変換: 大きい型の値を、小さい型の値に変換します。ただし、データ損失の可能性があるため、注意が必要です。例えば、int 型の値を char 型に変換する場合、値の一部が切り捨てられます。


C言語におけるスレッドストレージ期間:詳細リファレンス

C言語では、スレッドローカル変数のストレージ期間は、以下の2種類に分類されます。静的スレッドストレージ期間: 変数はプログラムの開始から終了まで存続します。自動スレッドストレージ期間: 変数は関数呼び出しの間のみ存続します。静的スレッドストレージ期間を持つ変数は、以下の特徴を持ちます。



mbstowcs 関数の代替方法:mbtowc 関数、iconv 関数、C++ の std::wstring クラス

mbstowcs 関数は、以下のプロトタイプを持つ関数です。pwc: 変換結果を格納するワイド文字列バッファへのポインタs: 変換対象のマルチバイト文字列へのポインタn: 変換する最大ワイド文字数この関数は、以下の処理を行います。マルチバイト文字列 s を処理し、最大 n 個のワイド文字に変換します。


SIGTERMハンドラでできること:C言語プログラミングの奥深さを探る

C言語でプログラムを開発する際、SIGTERMは重要な役割を果たします。このシグナルは、プログラムの終了を正常かつ安全に行うために使用されます。SIGTERMの概要SIGTERMは、プログラムの終了を要求するシグナルです。ユーザーがCtrl+Cキーを押したり、killコマンドを実行したりすると、このシグナルがプログラムに送信されます。


複数の例外設定をまとめて取得! C言語 Numerics ライブラリの fegetexceptflag 関数

fegetexceptflagは、以下の情報を取得します。浮動小数点例外が発生した際に、プログラムが終了するかどうか浮動小数点例外が発生した際に、プログラムがSIGFPEシグナルを受け取るかfegetexceptflagは以下の引数を受け取ります。


【初心者向け】C言語「Strings」における strtoll 関数の詳細解説とサンプルコード集

strtoll 関数は、C言語の標準ライブラリ stdlib. h に含まれる関数で、文字列を指定された基数に基づいて 64ビット整数 に変換します。これは、strtol 関数の機能を拡張したもので、より大きな整数値の処理に対応しています。


C言語 Numerics ライブラリ:cospi32 関数以外の DFT/IDFT 計算方法

概要:機能: DFT と IDFT の計算データ型: 32ビット浮動小数点数ヘッダーファイル: <complex. h>プロトタイプ:引数:n: データポイント数 (2 の累乗)dir: 変換方向 dir == 1: DFT 計算dir == 1: DFT 計算