c/c++で「負のゼロ」を削除するには? 私はこれを試しています-
#define isEq(a, b) ((abs(a-b)<EPS) ? 1 : 0)
#define NegZero(x) (x = isEq(x, -0.0) ? 0 : x)
大丈夫で安全ですか?または、他に簡単で安全な方法はありますか?特にコンテストコーディング用。助けてください....
c/c++で「負のゼロ」を削除するには? 私はこれを試しています-
#define isEq(a, b) ((abs(a-b)<EPS) ? 1 : 0)
#define NegZero(x) (x = isEq(x, -0.0) ? 0 : x)
大丈夫で安全ですか?または、他に簡単で安全な方法はありますか?特にコンテストコーディング用。助けてください....
コメントに投稿したコードでは、アプローチは正しいようです。答えはゼロに非常に近い負の数であり、( を使用してprintf("... %.3lf ...", ...)
) 3 桁に丸めているため、 のようになります-0.000
。0.0
あなたのアプローチ(使用に近いかどうかを確認します。使用し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 浮動小数点演算に負のゼロと呼ばれるものが実際にあるためです。その場合、提案された解決策は機能していたはずです。)