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 型のみ
条件分岐汎用性が高い少し冗長
ビット演算高速に実行できる移植性が低い
マクロ簡潔に記述できるマクロの使い過ぎはコードの可読性を低下させる



Morrow County, Oregon, United States の天気予報: 曇り、華氏50度

用途typeof_unqual は、主に以下の用途で使用されます。型の情報を取得するマクロやテンプレートの定義型のエイリアスの作成型推論の補助構文typeof_unqual の構文は以下の通りです。ここで、expression は、型の情報が必要な式または名前です。



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

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


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

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


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

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


C言語における評価順序とは?

C言語には、以下の 演算子グループ と 優先順位 が定められています。例この式の場合、* 演算子の優先順位が + 演算子よりも高いため、まず 20 * 3 が計算され、その結果 (60) が 10 と加算されます。シーケンスポイント は、式の評価順序が明確に定義されている箇所です。C言語には、以下の箇所がシーケンスポイントとなります。



include ディレクティブを使いこなして、C言語プログラミングをレベルアップ

#include ディレクティブは、以下の形式で記述されます。ファイル名 には、インクルードするファイルの名前を指定します。ヘッダーファイルの種類C言語には、標準ヘッダーファイルとユーザー定義ヘッダーファイルの2種類があります。標準ヘッダーファイル: 標準ライブラリを提供するファイルです。< と > で囲んで指定します。例:<stdio


様々なサンプルコードで理解を深める!nand32関数の多彩な使い方

nand32 は C言語における論理演算子の一つで、32ビット幅の整数に対して NAND 演算を実行します。NAND 演算は、NOT AND 演算とも呼ばれ、論理否定と論理積を組み合わせたものです。NAND 演算は、2つの入力ビットに対して以下の動作を行います。


C言語で双曲線正弦関数「sinh」をマスター!分かりやすい解説とサンプルコード

ヘッダーファイル:sinh 関数を使用するには、 <math. h> または <cmath> ヘッダーファイルをインクルードする必要があります。関数プロトタイプ:引数:x: 関数の計算対象となる値(角度ではなく、ラジアンで表されます)。戻り値:


C言語における「Concurrency support」と「once_flag」プログラミング

「once_flag」は、Concurrency support に関連する重要なデータ構造です。これは、スレッドセーフなフラグであり、一度だけ設定された値を保持します。once_flag は、以下の用途に使用されます。初期化処理を一度だけ実行する


C言語ループ制御の救世主!「continue」ステートメントの使い方と応用例

C言語の continue ステートメントは、ループ内で使用される制御構文です。 現在のループ反復の残りの処理をスキップし、次の反復へと移行させる役割を果たします。 主に、特定の条件を満たす場合に、ループ内の処理を部分的にスキップしたい場合に使用されます。