关于有签名的std:圆,我有一个问题:double round (double x);
假设我有这样的代码:
int i = std::round(0.9);在这种情况下,std::round应该返回1.00000000000,但这与0.9999999999999非常接近,我担心浮点错误最终会舍弃它。
我希望i == 1,但这是保证吗?
发布于 2017-11-07 08:34:25
std::round函数返回一个浮点值,“将大小写舍入为零”。与任何double到int隐式转换一样,编译器将发出警告:
从“double”到“int”的转换,可能会丢失数据
如果要返回整数值,请使用性病:一轮或std:lrint。
发布于 2017-11-07 08:42:11
是。只要您不溢出接收类型。
这里您不需要担心:std::round(0.9)会转到精确的1.0,因此i == 1 得到了的保证。
标准坚持最接近的积分值,可由一个double返回。
注意,尽管对于IEEE754 double,2的52次方以上的所有值都是积分值!其必然结果是,您的舍入候选数已经是一个整数值,因此函数简化为无操作。因此,例如,std::round(4503599627370496.5)将返回4503599627370496的事实,首先与4503599627370496.5不能表示为double这一事实有关。
作为最后的技术要点,请注意std::round表现得非常好,部分原因是任何形式的a.5 (它是四舍五入中的切入点)都是二进有理的,因此可以精确地用二进制浮点表示。这就是为什么另一种方法,例如添加0.5和截断,可以引入bug,因为如果这样做,就可以引入笑话数字。
发布于 2017-11-07 08:35:00
为此,C++标准遵从C标准。在N1570 (~C11)中,round的描述如下:
round函数以浮点格式将其参数舍入到最近的整数值,将大小写与零相舍五入,而不考虑当前的舍入方向。
然而,正如Ron所指出的,像lrint这样的函数完全可以做您想做的事情。
https://stackoverflow.com/questions/47153149
复制相似问题