「floor」関数との違いも解説!C言語「truncl」関数の詳細ガイド


truncl 関数は、浮動小数点数を指定された桁数で切り捨て、最も近い整数に変換します。これは、floor 関数と似ていますが、truncl 関数は負の数の切り捨てを小数点の桁数ではなく、整数部分で行います。

構文

double truncl(double x, int n);

引数

  • n: 切り捨てを行う桁数
  • x: 変換対象の浮動小数点数

戻り値

xn 桁数で切り捨てた最も近い整数を double 型で返します。

#include <stdio.h>

int main() {
  double x = 12.3456;
  int n = 2;

  double result = truncl(x, n);
  printf("%f を %d 桁で切り捨てた結果は %f です。\n", x, n, result);

  return 0;
}

この例では、12.34562 桁で切り捨てた結果は 12.0000 となります。

truncl 関数の利点

  • 浮動小数点数の精度が制限されている場合、truncl 関数を使用して精度を向上させることができます。
  • 負の数の切り捨てを小数点の桁数ではなく、整数部分で行うため、より正確な結果を得ることができます。

truncl 関数の注意点

  • truncl 関数は、引数として渡される値が double 型である必要があります。他の型の場合は、double 型に変換してから使用する必要があります。
  • truncl 関数は、常に切り捨てを行います。四捨五入や切り上げを行うには、他の関数を使用する必要があります。


例 1: 負の数の切り捨て

この例では、truncl 関数を使用して負の浮動小数点数を切り捨てます。

#include <stdio.h>

int main() {
  double x = -12.3456;
  int n = 2;

  double result = truncl(x, n);
  printf("%f を %d 桁で切り捨てた結果は %f です。\n", x, n, result);

  return 0;
}

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

-12.3456 を 2 桁で切り捨てた結果は -12.0000 です。

例 2: 浮動小数点数の精度向上

この例では、truncl 関数を使用して浮動小数点数の精度を向上させます。

#include <stdio.h>

int main() {
  double x = 1.23456789;
  int n = 5;

  double result = truncl(x, n);
  printf("%f を %d 桁で切り捨てた結果は %f (%.5f) です。\n", x, n, result, result);

  return 0;
}
1.23456789 を 5 桁で切り捨てた結果は 1.2345 (1.23450) です。

この例では、truncl 関数を使用して x5 桁で切り捨てています。その後、printf 関数を使用して切り捨て後の値と元の値を小数点第 5 桁まで表示しています。

例 3: 特定の桁数で切り捨て

この例では、truncl 関数を使用して特定の桁数で切り捨てます。

#include <stdio.h>

int main() {
  double x = 123.456789;
  int n = 3;

  double result = truncl(x * 1000, n) / 1000;
  printf("%f を 小数点第 %d 桁で切り捨てた結果は %f です。\n", x, n, result);

  return 0;
}
123.456789 を 小数点第 3 桁で切り捨てた結果は 123.000000 です。

この例では、x1000 倍してから truncl 関数を使用して 3 桁で切り捨てています。その後、結果を 1000 で割って元のスケールに戻しています。



floor 関数と符号反転

floor 関数は、浮動小数点数を常に切り捨てます。truncl 関数の機能を再現するには、floor 関数と符号反転を組み合わせることができます。

double truncl_alt(double x, int n) {
  if (x >= 0) {
    return floor(x * pow(10, n)) / pow(10, n);
  } else {
    return ceil(-x * pow(10, n)) / pow(10, n);
  }
}

このコードは、x が正の場合は floor 関数を使用して切り捨てを行い、負の場合は符号反転してから floor 関数を使用して切り捨てを行います。

手動による桁数切り捨て

シンプルな状況では、手動で桁数切り捨てを行うこともできます。

double truncl_manual(double x, int n) {
  double sign = x >= 0 ? 1 : -1;
  double power = pow(10, n);
  double truncated = floor(x * power) / power;
  return truncated * sign;
}

このコードは、pow 関数を使用して 10n 乗を計算し、x をその値で乗算します。その後、floor 関数を使用して切り捨てを行い、符号を元に戻します。

カスタム関数

特定のニーズに合致する truncl 関数の代替方法が必要な場合は、カスタム関数を作成することができます。

  • 読みやすさ: floor 関数と符号反転の組み合わせは、最も読みやすい方法ですが、最も冗長な方法でもあります。
  • パフォーマンス: 手動による桁数切り捨ては、最も単純な方法ですが、最もパフォーマンスが低い場合があります。
  • 精度: truncl 関数は、常に切り捨てを行うため、精度が最も高い場合があります。