C++向上和负零

发布于 2024-11-07 06:55:03 字数 118 浏览 4 评论 0原文

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

On VC++ 2008, ceil(-0.5) is returning -0.0. Is this usual/expected behavior? What is the best practice to avoid printing a -0.0 to i/o streams.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

離殇 2024-11-14 06:55:03

C++中的ceil来自C标准库。

C 标准规定,如果平台实现 IEEE-754 算术,则 ceil( ) 的行为就好像其参数根据 IEEE-754 roundTowardPositive 舍入属性舍入为整数。 IEEE-754 标准规定(第 6.3 条):

转换结果的符号,
量化操作,
roundToIntegral 运算,以及
roundToIntegralExact 的符号是
第一个或唯一的操作数。

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

ceil in C++ comes from the C standard library.

The C standard says that if a platform implements IEEE-754 arithmetic, ceil( ) behaves as though its argument were rounded to integral according to the IEEE-754 roundTowardPositive rounding attribute. The IEEE-754 standard says (clause 6.3):

the sign of the result of conversions,
the quantize operation, the
roundToIntegral operations, and the
roundToIntegralExact is the sign of
the first or only operand.

So the sign of the result should always match the sign of the input. For inputs in the range (-1,0), this means that the result should be -0.0.

心房的律动 2024-11-14 06:55:03

这是正确的行为。请参阅零值上的一元运算符 - () - c++http://en.wikipedia.org/wiki/Signed_zero

我偏向于进行 static_cast< int>(ceil(-0.5)); 但我并不认为这是“最佳实践”。

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

This is correct behavior. See Unary Operator-() on zero values - c++ and http://en.wikipedia.org/wiki/Signed_zero

I am partial to doing a static_cast<int>(ceil(-0.5)); but I don't claim that is "best practice".

Edit: You could of course cast to whatever integral type was appropriate (uint64_t, long, etc.)

恍梦境° 2024-11-14 06:55:03

我不能说我知道这是常见的,但为了避免打印它,请实施检查,如下所示:

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

I can't say that I know that it is usual, but as for avoiding printing it, implement a check, something like this:

if(var == -0.0)
{
    var = 0.0;
}
// continue
饭团 2024-11-14 06:55:03

是的,这很平常。

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

数字将为 0

Yes this is usual.

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

number will be 0

狼性发作 2024-11-14 06:55:03

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

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

这里的输出是“-0.0”

I see why ceil(-0.5) is returning -0.0. It's because for negative numbers, ceil is returning the integer part of the operand:

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

The output here is "-0.0"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文