round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <math.h> で定義
|
||
float roundf( float arg ); |
(1) | (C99以上) |
double round( double arg ); |
(2) | (C99以上) |
long double roundl( long double arg ); |
(3) | (C99以上) |
| ヘッダ <tgmath.h> で定義
|
||
#define round( arg ) |
(4) | (C99以上) |
| ヘッダ <math.h> で定義
|
||
long lroundf( float arg ); |
(5) | (C99以上) |
long lround( double arg ); |
(6) | (C99以上) |
long lroundl( long double arg ); |
(7) | (C99以上) |
| ヘッダ <tgmath.h> で定義
|
||
#define lround( arg ) |
(8) | (C99以上) |
| ヘッダ <math.h> で定義
|
||
long long llroundf( float arg ); |
(9) | (C99以上) |
long long llround( double arg ); |
(10) | (C99以上) |
long long llroundl( long double arg ); |
(11) | (C99以上) |
| ヘッダ <tgmath.h> で定義
|
||
#define llround( arg ) |
(12) | (C99以上) |
1-3) (浮動小数点形式の)
arg に最も近い整数値を計算します。 中間の場合はゼロから離れる方向に丸められます。 現在の丸めモードは影響しません。5-7, 9-11) (整数形式の)
arg に最も近い整数値を計算します。 中間の場合はゼロから離れる方向に丸められます。 現在の丸めモードは影響しません。4,8,12) 型総称マクロ。
arg が long double 型の場合はぞれぞれ roundl, lroundl, llroundl が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は round, lround, llround が呼ばれます。 そうでなければ roundf, lroundf, llroundf が呼ばれます。引数
| arg | - | 浮動小数点値 |
戻り値
エラーが発生しなければ、 arg に最も近い (中間の場合はゼロから離れる方向に丸めた) 整数値が返されます。
定義域エラーが発生した場合、処理系定義の値が返されます。
エラー処理
math_errhandling で規定されている通りにエラーが報告されます。
lround または llround の結果が戻り値の型で表現可能な範囲外の場合、定義域エラーまたは地域エラーが発生するかもしれません。
処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、
round,roundf,roundl関数については
- 現在の丸めモードは効果を持ちません。
argが ±∞ であれば、それが変更されずに返されます。argが ±0 であれば、それが変更されずに返されます。argが NaN であれば、 NaN が返されます。
lroundおよびllroundファミリーの関数については
- FE_INEXACT が発生することはありません。
- 現在の丸めモードは効果を持ちません。
argが ±∞ であれば、 FE_INVALID が発生し、処理系定義の値が返されます。- 丸めの結果が戻り値の型の範囲外の場合、 FE_INVALID が発生し、処理系定義の値が返されます。
argが NaN であれば、 FE_INVALID が発生し、処理系定義の値が返されます。
ノート
非整数の有限な値を丸めるとき、 round によって FE_INEXACT が発生するかもしれません (が要求されているわけではありません)。
すべての標準の浮動小数点フォーマットにおいて、最も大きな表現可能な浮動小数点値は正確な整数であるため、 round それ自体はオーバーフローすることはありません。 しかし任意の整数型 (intmax_t も含みます) は、整数変数に格納するとき、結果がオーバーフローするかもしれません。
POSIX は、 lround または llround が FE_INEXACT を発生するすべてのケースは定義域エラーであると規定しています。
round の double 版は以下のように実装されているかのように動作します。
#include <math.h>
double round(double x)
{
return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5);
}
例
Run this code
#include <stdio.h>
#include <math.h>
#include <fenv.h>
#include <limits.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
// round
printf("round(+2.3) = %+.1f ", round(2.3));
printf("round(+2.5) = %+.1f ", round(2.5));
printf("round(+2.7) = %+.1f\n", round(2.7));
printf("round(-2.3) = %+.1f ", round(-2.3));
printf("round(-2.5) = %+.1f ", round(-2.5));
printf("round(-2.7) = %+.1f\n", round(-2.7));
printf("round(-0.0) = %+.1f\n", round(-0.0));
printf("round(-Inf) = %+f\n", round(-INFINITY));
// lround
printf("lround(+2.3) = %ld ", lround(2.3));
printf("lround(+2.5) = %ld ", lround(2.5));
printf("lround(+2.7) = %ld\n", lround(2.7));
printf("lround(-2.3) = %ld ", lround(-2.3));
printf("lround(-2.5) = %ld ", lround(-2.5));
printf("lround(-2.7) = %ld\n", lround(-2.7));
printf("lround(-0.0) = %ld\n", lround(-0.0));
printf("lround(-Inf) = %ld\n", lround(-INFINITY)); // FE_INVALID が発生します
// エラー処理
feclearexcept(FE_ALL_EXCEPT);
printf("lround(LONG_MAX+1.5) = %ld\n", lround(LONG_MAX+1.5));
if(fetestexcept(FE_INVALID)) puts(" FE_INVALID was raised");
}
出力例:
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
round(-0.0) = -0.0
round(-Inf) = -inf
lround(+2.3) = 2 lround(+2.5) = 3 lround(+2.7) = 3
lround(-2.3) = -2 lround(-2.5) = -3 lround(-2.7) = -3
lround(-0.0) = 0
lround(-Inf) = -9223372036854775808
lround(LONG_MAX+1.5) = -9223372036854775808
FE_INVALID was raised
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.12.9.6 The round functions (p: 253)
- 7.12.9.7 The lround and llround functions (p: 253)
- 7.25 Type-generic math <tgmath.h> (p: 373-375)
- F.10.6.6 The round functions (p: 527)
- F.10.6.7 The lround and llround functions (p: 528)
- C99 standard (ISO/IEC 9899:1999):
- 7.12.9.6 The round functions (p: 233)
- 7.12.9.7 The lround and llround functions (p: 234)
- 7.22 Type-generic math <tgmath.h> (p: 335-337)
- F.9.6.6 The round functions (p: 464)
- F.9.6.7 The lround and llround functions (p: 464)
関連項目
(C99)(C99) |
指定された値より大きくない最も大きな整数を返します (関数) |
(C99)(C99) |
指定された値より小さくない最も小さな整数を返します (関数) |
(C99)(C99)(C99) |
指定された値より絶対値が大きくない最も近い整数に丸めます (関数) |
round の C++リファレンス
| |