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