C 言語の round 関数

胡金庫 2023年10月12日
  1. 関数 round を使って浮動小数点数を最も近い整数に丸めて浮動小数点数を返す
  2. 関数 lround を用いて浮動小数点数を最も近い整数に丸めて積分型を返す
  3. 関数 ceil を用いて浮動小数点数を引数以下の最小の積分値に丸める
C 言語の round 関数

この記事では、C 言語で round 関数を使用する方法をいくつか説明します。

関数 round を使って浮動小数点数を最も近い整数に丸めて浮動小数点数を返す

関数 round<math.h> ヘッダファイルで定義されている C 標準ライブラリの数学ユーティリティの一部です。このファミリには、roundroundfroundl の 3つの関数があります。これらの関数は異なる型の浮動小数点数に対応しており、それぞれが対応する型の値を返します。math ヘッダを含むソースファイルは、ライブラリコードをリンクするために -lm フラグを使ってコンパイルする必要があることに注意してください。以下のコード例では、複数の float リテラル値に対する変換を示し、その結果をコンソールに出力しています。round は本質的にゼロから丸めていることに注意してください。引数に積分値 -0+0NaNINFINITY を渡すと、同じ値が返されます。

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

int main(void) {
  printf("round(+2.3) = %+.1f\n", round(2.3));
  printf("round(+2.5) = %+.1f\n", round(2.5));
  printf("round(+2.7) = %+.1f\n", round(2.7));
  printf("round(-2.3) = %+.1f\n", round(-2.3));
  printf("round(-2.5) = %+.1f\n", round(-2.5));
  printf("round(-2.7) = %+.1f\n", round(-2.7));

  exit(EXIT_SUCCESS);
}

出力:

round(+2.3) = +2.0
round(+2.5) = +3.0
round(+2.7) = +3.0
round(-2.3) = -2.0
round(-2.5) = -3.0
round(-2.7) = -3.0

関数 lround を用いて浮動小数点数を最も近い整数に丸めて積分型を返す

一方、関数 lround は整数に最も近い値に丸めて積分値を返します。このファミリには 6つの関数があり、そのうちの半分の関数は long int を丸めた値として返し、その他の関数は long long int を返します。lroundround ファミリーに似ており、中途半端な実数をゼロから遠ざけるように丸めます。

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

int main(void) {
  printf("lround(+2.3) = %ld\n", lround(2.3));
  printf("lround(+2.5) = %ld\n", lround(2.5));
  printf("lround(+2.7) = %ld\n", lround(2.7));
  printf("lround(-2.3) = %ld\n", lround(-2.3));
  printf("lround(-2.5) = %ld\n", lround(-2.5));
  printf("lround(-2.7) = %ld\n", lround(-2.7));

  exit(EXIT_SUCCESS);
}

出力:

lround(+2.3) = 2
lround(+2.5) = 3
lround(+2.7) = 3
lround(-2.3) = -2
lround(-2.5) = -3
lround(-2.7) = -3

関数 ceil を用いて浮動小数点数を引数以下の最小の積分値に丸める

あるいは、関数 ceil を利用して、与えられた浮動小数点数を、引数そのものよりも小さくない最小の整数値に丸めることもできます。関数 round と同様に、このファミリにも 3つの関数があります - ceilceilfceill で、それぞれ floatdoublelong double 型に利用されます。prinf 指定文字列に + 記号を含めると、丸められた引数に対応する記号が自動的に表示されることに注意してください。

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

int main(void) {
  printf("ceil(+2.3) = %+.1f\n", ceil(2.3));
  printf("ceil(+2.5) = %+.1f\n", ceil(2.5));
  printf("ceil(+2.7) = %+.1f\n", ceil(2.7));
  printf("ceil(-2.3) = %+.1f\n", ceil(-2.3));
  printf("ceil(-2.5) = %+.1f\n", ceil(-2.5));
  printf("ceil(-2.7) = %+.1f\n", ceil(-2.7));

  exit(EXIT_SUCCESS);
}

出力:

ceil(+2.3) = 3.000000
ceil(+2.5) = 3.000000
ceil(+2.7) = 3.000000
ceil(-2.3) = -2.000000
ceil(-2.5) = -2.000000
ceil(-2.7) = -2.000000
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Math