Как перевернуть знак числа, если выполняются два условия? - PullRequest
0 голосов
/ 16 апреля 2020

Я ищу математическое выражение, чтобы перевернуть знак числа, если два других числа положительны.

Это легко для одного условия x > 0, в этом случае я бы сделал num *= sign(x).

Но как это сделать с двумя условиями x > 0 и y > 0? Это неверно:

num *= sign(-x) * sign(-y)

(так как он меняет знак также, если оба x < 0 и y < 0, что мне не нужно).

Я бы придумал

num *= sgn(-x) ** H(y)

и

num *= 1 - 2 * H(x) * H(y)

, где H - шаговая функция Хевисайда, но пока она короткая, она не явная.

num *= (-1)^(H(x) * H(y))

- это немного лучше, но можем ли мы go лучше / короче / более явно?

Этот вопрос не относится * к конкретному языку программирования c - на самом деле, он вообще не касается программирования, поэтому использование if не совсем то, что я хочу. Я ищу что-то наподобие in-line, если для математиков, и я подумал, что найду людей с лучшим мышлением для этого вопроса на форуме программистов ... пожалуйста, скажите мне, что я был прав;)

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

РЕДАКТИРОВАТЬ : Как указал @MarkDickinson, вы можете использовать -sign(min(x, y)):

num *= -1 * sign(min(x, y))

Тогда:

  • Если оба положительны - результат равен -1.
  • Если хотя бы один из них отрицателен - результат равен 1.
1 голос
/ 16 апреля 2020

Вы можете использовать троичный оператор :

В математике тернарная операция - это n-арная операция с n = 3. Тройная операция на множестве A требует любые заданные три элемента A и объединяет их в один элемент A. Тернарный оператор - это оператор, который принимает три аргумента. Первый аргумент - это аргумент сравнения, второй - результат истинного сравнения, а третий - результат ложного сравнения.

Например, в C ++ это будет выглядеть так:

num *= (x>0 && y>0) ? -1 : 1;

, который представляет (condition) ? if_true : if_false.

Это также будет работать для особого случая, когда x и / или y оцениваются в 0, так как он не будет переворачивать знак. Примечание знак (0) обычно определяется как 0, и это не то поведение, о котором вы говорили, что хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...