首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从std::圆形进行int安全吗?

从std::圆形进行int安全吗?
EN

Stack Overflow用户
提问于 2017-11-07 08:26:51
回答 6查看 7.7K关注 0票数 19

关于有签名的std:圆,我有一个问题:double round (double x);

假设我有这样的代码:

代码语言:javascript
复制
int i = std::round(0.9);

在这种情况下,std::round应该返回1.00000000000,但这与0.9999999999999非常接近,我担心浮点错误最终会舍弃它。

我希望i == 1,但这是保证吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-11-07 08:34:25

std::round函数返回一个浮点值,“将大小写舍入为零”。与任何doubleint隐式转换一样,编译器将发出警告:

从“double”到“int”的转换,可能会丢失数据

如果要返回整数值,请使用性病:一轮std:lrint

票数 14
EN

Stack Overflow用户

发布于 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,因为如果这样做,就可以引入笑话数字。

票数 9
EN

Stack Overflow用户

发布于 2017-11-07 08:35:00

为此,C++标准遵从C标准。在N1570 (~C11)中,round的描述如下:

round函数以浮点格式将其参数舍入到最近的整数值,将大小写与零相舍五入,而不考虑当前的舍入方向。

然而,正如Ron所指出的,像lrint这样的函数完全可以做您想做的事情。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47153149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档