макросов — Как удалить отрицательные нули из кодов C ++?

Как убрать «отрицательный ноль» в с / с ++?
Я пытаюсь это-

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

Это нормально и безопасно?
или же
Есть ли другой простой и безопасный способ?
Специально для конкурсного кодирования.
пожалуйста помоги….

-3

Решение

С кодом, который вы разместили в ваших комментариях, ваш подход кажется правильным: ваш ответ — отрицательное число, которое очень близко к нулю, и потому что вы округляете его до трех цифр (используя 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 с плавающей запятой фактически есть нечто, называемое отрицательным нулем. Если бы это было так, предложенные решения сработали бы.)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]