对双倍值执行std::ceil
时,该值将向上舍入为整数。所以3.3将成为4.0。哪个可以被转换或截断为int
。这将在逗号之后“切掉”部分。所以:
int foo = (int)std::ceil(3.3);
乍一看,这将在foo中存储4个。但是,double是浮点值。因此它可能是4.000000001
或3.999999999
。后者将被截断为3.
但在实践中我从未见过这种行为。我可以安全地假设任何实现都会返回4吗?或者只是IEEE-754
才能做到这一点。或者我只是幸运吗?
答案 0 :(得分:5)
舍入(或天花板)双精灵永远总是一目了然。
对于低于2 ^(m + 1)的浮点数,其中m是mantissal位的数量,所有整数都有精确的表示,因此结果可以准确表示。
对于高于2 ^(m + 1)的浮点数...它们已经是整数。有意义的是,如果你考虑一下:没有足够的mantissal位向下延伸到小数点的右边。所以再次舍入/细化是准确的。
答案 1 :(得分:0)
ceil
的行为与C中的行为类似,标准中的内容为
The ceil functions compute the smallest integer value not less than x.
ceil
的结果始终是整数的浮点表示;但是,截断时结果可能会溢出整数类型。
在您的特定情况下,std::ceil(3.3)
必须正好是4.0
,因为这是“不小于”3.3
的最小整数值。