std::round
STD:圆形,STD::lART,STD::11圈
Defined in header | | |
---|---|---|
float round( float arg | (1) | (since C++11) |
double round( double arg | (2) | (since C++11) |
long double round( long double arg | (3) | (since C++11) |
double round( Integral arg | (4) | (since C++11) |
long lround( float arg | (5) | (since C++11) |
long lround( double arg | (6) | (since C++11) |
long lround( long double arg | (7) | (since C++11) |
long lround( Integral arg | (8) | (since C++11) |
long long llround( float arg | (9) | (since C++11) |
long long llround( double arg | (10) | (since C++11) |
long long llround( long double arg | (11) | (since C++11) |
long long llround( Integral arg | (12) | (since C++11) |
1-3%29将最近的整数值计算为arg
%28在浮点格式%29,四舍五入的情况下从零,无论当前的舍入模式。
5-7,9-11%29将最近的整数值计算为arg
%28中整数格式%29,舍入从零到一半大小写,而不考虑当前的舍入模式。
4,8,12%29一组过载或接受任意参数的函数模板积分型。分别相当于2%29,6%29或10%29,分别为%28。double
29%。
参数
arg | - | floating point value |
---|
返回值
如果没有发生错误,则最近的整数值为arg
,将从零到一半的情况返回。
返回值
二次
二次
论辩
如果发生域错误,则返回实现定义的值。
错误处理
错误按数学[医]错误处理...
如果...的结果...std::lround
或std::llround
在返回类型可表示的范围之外,可能会发生域错误或范围错误。
如果实现支持ieee浮点算术%28iec 60559%29,则对std::round
职能:
- 电流舍入方式没有效果。
- 如果
arg
是±∞,它被返回,未经修改
- 如果
arg
是±0,它被返回,未经修改
- 如果
arg
是南,南回来了
为std::lround
和std::llround
职能:
FE_INEXACT
永远不会被提起
- 电流舍入方式没有效果。
- 如果
arg
是±∞,FE_INVALID
引发,并返回实现定义的值。
- 如果舍入的结果超出了返回类型的范围,
FE_INVALID
引发,并返回实现定义的值。
- 如果
arg
是南FE_INVALID
引发,并返回实现定义的值。
注记
FE_INEXACT
可能是%28,但%27 T是否需要由std::round
当舍入一个非整数的有限值时。
最大的可表示浮点值是所有标准浮点格式的精确整数,因此std::round
永远不要自己溢出,但是结果可能会溢出任何整数类型%28,包括std::intmax_t
%29,存储在整数变量中。
POSIX指定所有案件std::lround
或std::llround
提高FE_INEXACT
是域错误。
大double
版本std::round
其行为似乎如下所示:
二次
#include <cmath>
#include <cfenv>
#pragma STDC FENV_ACCESS ON
double round(double x)
{
std::fenv_t save_env;
std::feholdexcept(&save_env
double result = std::rint(x
if (std::fetestexcept(FE_INEXACT)) {
auto const save_round = std::fegetround(
std::fesetround(FE_TOWARDZERO
result = std::rint(std::copysign(0.5 + std::fabs(x), x)
std::fesetround(save_round
}
std::feupdateenv(&save_env
return result;
}
二次
例
二次
#include <iostream>
#include <cmath>
#include <cfenv>
#include <climits>
#pragma STDC FENV_ACCESS ON
int main()
{
// round
std::cout << "round(+2.3) = " << std::round(2.3)
<< " round(+2.5) = " << std::round(2.5)
<< " round(+2.7) = " << std::round(2.7) << '\n'
<< "round(-2.3) = " << std::round(-2.3)
<< " round(-2.5) = " << std::round(-2.5)
<< " round(-2.7) = " << std::round(-2.7) << '\n';
std::cout << "round(-0.0) = " << std::round(-0.0) << '\n'
<< "round(-Inf) = " << std::round(-INFINITY) << '\n';
// lround
std::cout << "lround(+2.3) = " << std::lround(2.3)
<< " lround(+2.5) = " << std::lround(2.5)
<< " lround(+2.7) = " << std::lround(2.7) << '\n'
<< "lround(-2.3) = " << std::lround(-2.3)
<< " lround(-2.5) = " << std::lround(-2.5)
<< " lround(-2.7) = " << std::lround(-2.7) << '\n';
std::cout << "lround(-0.0) = " << std::lround(-0.0) << '\n'
<< "lround(-Inf) = " << std::lround(-INFINITY) << '\n';
// error handling
std::feclearexcept(FE_ALL_EXCEPT
std::cout << "std::lround(LONG_MAX+1.5) = "
<< std::lround(LONG_MAX+1.5) << '\n';
if(std::fetestexcept(FE_INVALID))
std::cout << " FE_INVALID was raised\n";
}
二次
可能的产出:
二次
round(+2.3) = 2 round(+2.5) = 3 round(+2.7) = 3
round(-2.3) = -2 round(-2.5) = -3 round(-2.7) = -3
round(-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
std::lround(LONG_MAX+1.5) = -9223372036854775808
FE_INVALID was raised
二次
另见
floor | nearest integer not greater than the given value (function) |
---|---|
ceil | nearest integer not less than the given value (function) |
trunc (C++11) | nearest integer not greater in magnitude than the given value (function) |
c轮文件
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。