如何从 C++ 代码中删除负零?
How to remove negative Zeros from c++ codes?
如何删除c/c++中的"negative zero"?
我正在尝试这个-
#define isEq(a, b) ((abs(a-b)<EPS) ? 1 : 0)
#define NegZero(x) (x = isEq(x, -0.0) ? 0 : x)
安全吗?
要么
还有其他简单安全的方法吗?
专门用于竞赛编码。
请帮助....
根据您在评论中发布的代码,您的方法似乎是正确的:您的答案是一个非常接近于零的负数,并且因为您将其四舍五入为三位数(使用 printf("... %.3lf ...", ...)
) , 看起来像 -0.000
。您的方法(使用 abs(a - b) < epsilon
检查它是否接近 0.0
;如果是,则使用 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 浮点运算中实际上有一种叫做负零的东西。如果是这样的话,建议的解决方案就会起作用。)
如何删除c/c++中的"negative zero"? 我正在尝试这个-
#define isEq(a, b) ((abs(a-b)<EPS) ? 1 : 0)
#define NegZero(x) (x = isEq(x, -0.0) ? 0 : x)
安全吗? 要么 还有其他简单安全的方法吗? 专门用于竞赛编码。 请帮助....
根据您在评论中发布的代码,您的方法似乎是正确的:您的答案是一个非常接近于零的负数,并且因为您将其四舍五入为三位数(使用 printf("... %.3lf ...", ...)
) , 看起来像 -0.000
。您的方法(使用 abs(a - b) < epsilon
检查它是否接近 0.0
;如果是,则使用 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 浮点运算中实际上有一种叫做负零的东西。如果是这样的话,建议的解决方案就会起作用。)