round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl
提供: cppreference.com
| ヘッダ <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> #include <fenv.h> #pragma STDC FENV_ACCESS ON double round(double x) { fenv_t save_env; feholdexcept(&save_env); double result = rint(x); if (fetestexcept(FE_INEXACT)) { fesetround(FE_TOWARDZERO); result = rint(copysign(0.5 + fabs(x), x)); } feupdateenv(&save_env); return result; }
[編集] 例
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 raised // error handling 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++リファレンス
| |

