-3

如何删除 C/C++ 中的“负零”?我正在尝试这个-

#define isEq(a, b) ((abs(a-b)<EPS) ? 1 : 0)
#define NegZero(x) (x = isEq(x, -0.0) ? 0 : x)

是否正常且安全?或者还有其他简单安全的方法吗?专门用于竞赛编码。请帮忙....

4

1 回答 1

0

使用您在评论中发布的代码,您的方法似乎是正确的:您的答案是一个非常接近于零的负数,并且因为您将其四舍五入为三位数(使用printf("... %.3lf ...", ...)),它看起来像-0.000. 您的方法(检查它是否接近0.0using abs(a - b) < epsilon;如果是,则使用0.0,否则使用值本身)大部分是正确的,除了宏不完全适合的问题。

而不是写

printf("(%.3lf,%.3lf)\n", I1.x, I1.y);

我建议使用类似的东西

printf(
    "(%.3lf,%.3lf)\n",
    NegZero(I1.x),
    NegZero(I1.y)
);

并定义(虽然我会选择不同的名字)

static inline bool isEq(double x, double y) {
    return abs(x, y) < EPS;
}

static inline NegZero(double x) {
    if (isEq(x, 0.0)) {
        return 0.0;
    } else {
        return x;
    }
}

(混淆评论的原因是在 IEEE 浮点算术中实际上有一个叫做负零的东西。如果是这样的话,建议的解决方案会奏效。)

于 2015-11-08T19:05:54.510 回答