C言語:fminl関数で2つの数値を比較して小さい方を見つける方法


long double fminl(long double x, long double y);

引数

  • y: 比較対象となる2番目の long double 型数値
  • x: 比較対象となる最初の long double 型数値

戻り値

  • 両方の引数が NaN の場合でも、NaN を返します。
  • 引数のいずれかが NaN(Not a Number) の場合、NaN を返します。
  • xy のうち、小さい方の値を返します。

機能

fminl 関数は、2 つの long double 型数値を比較し、小さい方の値を返します。これは、配列の最小値を見つけたり、2 つの測定値のうち小さい方を比較したりするなど、さまざまな状況で使用できます。


以下のコード例は、fminl 関数を使用して、2 つの long double 型数値 xy の最小値を求める方法を示しています。

#include <math.h>

int main() {
  long double x = 10.5;
  long double y = 7.2;

  long double min_value = fminl(x, y);

  printf("The smaller value is: %Lf\n", min_value);

  return 0;
}

このコードを実行すると、以下の出力が得られます。

The smaller value is: 7.200000
  • C++ では、fminl 関数はテンプレート関数としてオーバーロードされています。
  • fminl 関数は、浮動小数点演算の誤差の影響を受ける可能性があります。高精度な計算が必要な場合は、注意が必要です。
  • fminl 関数は、float 型と double 型の引数を受け取る fminfminf 関数の long double 型バージョンです。


配列の最小値を見つける

この例では、fminl 関数を使用して、配列 numbers の最小値を見つけます。

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

int main() {
  double numbers[] = {5.2, -3.1, 10.7, 4.6, -2.8};
  int size = sizeof(numbers) / sizeof(double);

  double min_value = numbers[0];

  for (int i = 1; i < size; i++) {
    min_value = fminl(min_value, numbers[i]);
  }

  printf("The minimum value in the array is: %lf\n", min_value);

  return 0;
}
The minimum value in the array is: -3.100000

2 つの測定値の最小値を比較する

この例では、fminl 関数を使用して、2 つの測定値 xy の最小値を比較します。

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

int main() {
  double x = 12.4;
  double y = 8.9;

  double min_value = fminl(x, y);

  printf("The smaller value is: %lf\n", min_value);

  return 0;
}
The smaller value is: 8.900000

この例では、fminl 関数を使用して、条件に応じて最小値を計算します。

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

int main() {
  double x = 15.3;
  double y = 22.6;
  double z = -7.1;

  double min_value = x;

  if (y < min_value) {
    min_value = y;
  }

  if (z < min_value) {
    min_value = z;
  }

  printf("The smallest value of x, y, and z is: %lf\n", min_value);

  return 0;
}
The smallest value of x, y, and z is: -7.100000


以下に、fminl 関数の代替方法をいくつか紹介します。

標準比較演算子

最も単純な代替方法は、標準比較演算子 (<) を使用して、2 つの数値を直接比較することです。

long double min_value = x < y ? x : y;

このコードは、xy より小さい場合に x を、そうでない場合は ymin_value に代入します。

if 文

より明示的な方法として、if 文を使用して、最小値を計算できます。

if (x < y) {
  min_value = x;
} else {
  min_value = y;
}

テンプレート関数

C++ では、fminl 関数はテンプレート関数としてオーバーロードされています。つまり、float 型、double 型、long double 型を含む任意の型の引数を受け取ることができます。

#include <iostream>

using namespace std;

int main() {
  float x = 5.2f;
  float y = 3.1f;

  float min_value = min(x, y);

  cout << "The smaller value is: " << min_value << endl;

  return 0;
}

このコードは、xy の最小値を min_value に代入します。

カスタム関数

特定のニーズに合わせたカスタム関数を作成することもできます。たとえば、NaN や無限大の値を処理する必要がある場合は、独自の関数を作成する必要があります。

long double custom_min(long double x, long double y) {
  if (isnan(x) || isinf(x)) {
    return y;
  } else if (isnan(y) || isinf(y)) {
    return x;
  } else {
    return x < y ? x : y;
  }
}

このコードは、x または yNaN または無限大の場合、もう一方の値を返します。そうでない場合は、xy の最小値を返します。

選択の指針

fminl 関数の代替方法を選択する際には、以下の点を考慮する必要があります。

  • 機能
    カスタム関数を使用すると、NaN や無限大の値などの特殊なケースを処理することができます。
  • パフォーマンス
    標準比較演算子や if 文は、fminl 関数よりも高速に実行される場合があります。
  • データ型
    使用するデータ型に応じて、適切な関数を選択する必要があります。