C ++ ceil和负零

时间:2011-05-13 03:09:09

标签: c++ visual-studio-2008 floating-point ceil

在VC ++ 2008上,ceil(-0.5)正在返回-0.0。这是通常/预期的行为吗?避免将-0.0打印到i / o流的最佳做法是什么。

5 个答案:

答案 0 :(得分:3)

这是正确的行为。请参阅Unary Operator-() on zero values - c++http://en.wikipedia.org/wiki/Signed_zero

我偏爱做static_cast<int>(ceil(-0.5));,但我并不认为这是“最佳做法”。

编辑:您当然可以转换为适当的整数类型(uint64_t,long等)

答案 1 :(得分:2)

C ++中的

ceil来自C标准库。

C标准表示,如果平台实现IEEE-754算法,ceil( )的行为就好像其参数根据IEEE-754 roundTowardPositive 舍入属性四舍五入为整数。 IEEE-754标准说(第6.3条):

  

转化结果的标志,   量化操作,   roundToIntegral操作,和   roundToIntegralExact是标志   第一个或唯一的操作数。

因此结果的符号应始终与输入的符号相匹配。对于(-1,0)范围内的输入,这意味着结果应为-0.0

答案 2 :(得分:1)

我不能说我知道这是通常的,但至于避免打印,请执行检查,如下所示:

if(var == -0.0)
{
    var = 0.0;
}
// continue

答案 3 :(得分:0)

是的,这是正常的。

int number = (int) ceil(-0.5);

数字将为0

答案 4 :(得分:0)

我知道为什么ceil(-0.5)正在返回-0.0。这是因为对于负数,ceil返回操作数的整数部分:

double af8IntPart;
double af8FracPart = modf(-0.5, & af8IntPart);
cout << af8IntPart;

此处的输出为“-0.0”