Как убрать «отрицательный ноль» в с / с ++?
Я пытаюсь это-
#define isEq(a, b) ((abs(a-b)<EPS) ? 1 : 0)
#define NegZero(x) (x = isEq(x, -0.0) ? 0 : x)
Это нормально и безопасно?
или же
Есть ли другой простой и безопасный способ?
Специально для конкурсного кодирования.
пожалуйста помоги….
С кодом, который вы разместили в ваших комментариях, ваш подход кажется правильным: ваш ответ — отрицательное число, которое очень близко к нулю, и потому что вы округляете его до трех цифр (используя printf("... %.3lf ...", ...)
), это выглядит как -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 с плавающей запятой фактически есть нечто, называемое отрицательным нулем. Если бы это было так, предложенные решения сработали бы.)
Других решений пока нет …