6

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

4

5 回答 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 回答