在 VC++ 2008 上,ceil(-0.5)
正在返回-0.0
. 这是通常/预期的行为吗?避免打印-0.0
到 i/o 流的最佳做法是什么。
问问题
2597 次
5 回答
3
这是正确的行为。参见零值上的一元运算符-() - c++和http://en.wikipedia.org/wiki/Signed_zero
我偏爱做一个static_cast<int>(ceil(-0.5));
,但我不认为这是“最佳实践”。
编辑:您当然可以转换为任何合适的整数类型(uint64_t、long 等)
于 2011-05-13T03:22:09.223 回答
3
ceil
在 C++ 中来自 C 标准库。
C 标准规定,如果平台实现了 IEEE-754 算法,ceil( )
则其行为就像根据 IEEE-754 roundTowardPositive舍入属性将其参数舍入为整数一样。IEEE-754 标准说(条款 6.3):
转换结果的符号,量化操作,roundToIntegral 操作,roundToIntegralExact 是第一个或唯一操作数的符号。
因此结果的符号应始终与输入的符号匹配。对于范围内的输入(-1,0)
,这意味着结果应该是-0.0
。
于 2011-05-13T04:29:06.423 回答
1
我不能说我知道这很常见,但至于避免打印它,请执行检查,如下所示:
if(var == -0.0)
{
var = 0.0;
}
// continue
于 2011-05-13T03:16:33.503 回答
0
是的,这很常见。
int number = (int) ceil(-0.5);
数字将为 0
于 2011-05-13T03:16:33.093 回答
0
我明白为什么ceil(-0.5)
要回来了-0.0
。这是因为对于负数,ceil
返回操作数的整数部分:
double af8IntPart;
double af8FracPart = modf(-0.5, & af8IntPart);
cout << af8IntPart;
这里的输出是“-0.0”
于 2011-05-13T04:01:14.597 回答