Измените знак одного номера, чтобы он соответствовал знаку другого номера - PullRequest
0 голосов
/ 28 ноября 2018

Я не совсем уверен, что искать по этому вопросу.

Если у меня есть переменная A = 10. И еще одна переменная B. Если B отрицателен, я хочу сделать A = -10.Если B положительный, я хочу A = 10.

Вот как я делал это довольно часто:

A = A * abs (B) / B

Theочевидная проблема заключается в том, что если B равно нулю, я получаю ошибку деления на ноль.

Есть ли лучший (предпочтительно математический) способ сделать это без сложности условных операторов?

Backstory.Я работаю со студентами на графическом языке программирования робототехники под названием Lego EV3.Вышеприведенный алгоритм выглядит следующим образом:

enter image description here

Используя условное выражение, он выглядит так: enter image description here

Довольно пустая трата места, особенно когда вы работаете на 13 "экранах ноутбуков. И сбивает с толку.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Просто чтобы превратить комментарий @ MBo в официальный ответ, обратите внимание, что во многих языках есть функция с именем sign(x) или signum(x), которая возвращает -1, 0 или 1, если x отрицательно, ноль или плюс соответственно и другая функция abs(x) (для абсолютного значения), которую можно использовать вместе для достижения вашей цели:

A = abs(A) * sign(B)

скопирует знак из B в A если B ≠ 0.Если B == 0, вам придется сделать что-то дополнительное.

Многие языки ( C ++ , Java , python ) также имеют прямолинейный характер copysign(x, y) функция, которая делает именно то, что вы хотите, возвращая x, измененный, чтобы иметь знак y.

0 голосов
/ 28 ноября 2018

C99 имеет функцию (POSIX) copysign, которая делает именно это.У Фортрана это было целую вечность.Это также рекомендуемая IEEE 754 функция

0 голосов
/ 28 ноября 2018

Во многих языках программирования будет работать простой оператор if:

A = 10;
if (B < 0) {
    A = -1*A;
}

Если ваш язык поддерживает троичные выражения, мы могли бы сократить приведенное выше до одной строки:

A = B < 0 ? -1*A : A;

Другим вариантом может быть определение вспомогательной функции:

reverseSign(A, B) {
    if (B < 0) {
        return -1*A;
    }
    else {
        return A;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...