C++ C++;ceil与负零
在VC++2008上,C++ C++;ceil与负零,c++,visual-studio-2008,floating-point,ceil,C++,Visual Studio 2008,Floating Point,Ceil,在VC++2008上,ceil(-0.5)正在返回-0.0。这是正常的/预期的行为吗?避免将-0.0打印到i/o流的最佳实践是什么。是,这是常见的 int number = (int) ceil(-0.5); 数字将是0,我不能说我知道这是正常的,但是为了避免打印它,执行一个检查,类似这样: if(var == -0.0) { var = 0.0; } // continue 这是正确的行为。看到和 我喜欢做static_cast(ceil(-0.5))但我并不认为这是“最佳实践”
ceil(-0.5)
正在返回-0.0
。这是正常的/预期的行为吗?避免将-0.0
打印到i/o流的最佳实践是什么。是,这是常见的
int number = (int) ceil(-0.5);
数字将是0,我不能说我知道这是正常的,但是为了避免打印它,执行一个检查,类似这样:
if(var == -0.0)
{
var = 0.0;
}
// continue
这是正确的行为。看到和 我喜欢做
static_cast(ceil(-0.5))代码>但我并不认为这是“最佳实践”
编辑:您当然可以转换为任何合适的整数类型(uint64\u t、long等)我明白了为什么ceil(-0.5)
返回-0.0
。这是因为对于负数,ceil
返回操作数的整数部分:
double af8IntPart;
double af8FracPart = modf(-0.5, & af8IntPart);
cout << af8IntPart;
双af8IntPart;
双af8FracPart=modf(-0.5,&af8IntPart);
CUT< P> <代码> CEI/<代码>来自C++标准库。
C标准规定,如果平台实现IEEE-754算法,ceil()
的行为就像其参数根据IEEE-754roundToward正数舍入属性被舍入为整数一样。IEEE-754标准规定(第6.3条):
转换结果的符号,
量化操作
roundToIntegral运营,以及
roundToIntegralExact是
第一个或唯一的操作数
因此,结果的符号应始终与输入的符号匹配。对于(-1,0)
范围内的输入,这意味着结果应该是-0.0
,显然运算符=
不区分-0.0
和+0.0
,在这种情况下这并不重要。@Thomasmclod:这是因为根据IEEE754,-0.0==+0.0。请看,此代码段只是用作缓冲区,以确保您没有打印负号。我是以双精度
输出,而不是强制转换。@ThomasMcLeod如果必须使用双精度
,则必须接受负零是有效的。如果不希望它打印负号,可以添加如下检查代码std::cout Right,这是一个固定宽度的浮点输出。我仍然不明白为什么ceil
应该返回-0.0
@Chris:这将是ceil()
@Chris的一个非常奇怪的实现:值得注意的是,您链接的实现实际上不符合IEEE-754(在默认舍入模式下,对于ceil(-0.5),它将返回+0.0
)
,而IEEE-754说结果应该是-0.0
)。这就是我在原始答案中(算术上不正确)评论中所指的。谢谢你发布这个例子。