Можно ли использовать математические операторы *,/, +, -, ^ для преобразования ненулевого числа в 1?
Я работаю с программным обеспечением (Oracle Siebel), которое поддерживает только выражения JavaScript с операторами умножения, деления, вычитания, сложения и XOR (*
, /
, -
, +
, ^
). У меня нет других операторов, таких как !
или ? :
? :
доступно.
Используя приведенные выше операторы, можно ли преобразовать число в 1, если оно не равно нулю, и оставить 0, если оно уже равно нулю? Число может быть положительным, нулевым или отрицательным.
Пример:
var c = 55;
var d; // d needs to set as 1
Я пробовал c/c
, но он оценивает NaN
когда c
равно 0. d
должно быть 0, когда c
равно 0.
c является значением валюты, и оно будет иметь максимум две завершающие цифры и 12 начальных цифр.
Я пытаюсь эмулировать условие if
, конвертируя число в логическое значение 0 или 1, а затем умножая другие части выражения.
Ответы
Ответ 1
c/(c + 5e-324)
должно работать. (Константа 5e-324
- это Number.MIN_VALUE
, наименьшее представимое положительное число.) Если x равно 0, то это ровно 0, и если x ненулевое (технически, если x не меньше 4.45014771701440252e-308, что является наименьшим в вопросе допускается нулевое число, 0,01, математика JavaScript с плавающей точкой слишком неточна, чтобы ответ отличался от 1, поэтому он будет иметь значение ровно 1.
Ответ 2
Используйте выражение n/n^0
.
Если n
не ноль:
Step Explanation
------- -------------------------------------------------------------------------------
n/n^0 Original expression.
1^0 Any number divided by itself equals 1. Therefore n/n becomes 1.
1 1 xor 0 equals 1.
Если n
равно нулю:
Step Explanation
------- -------------------------------------------------------------------------------
n/n^0 Original expression.
0/0^0 Since n is 0, n/n is 0/0.
NaN^0 Zero divided by zero is mathematically undefined. Therefore 0/0 becomes NaN.
0^0 In JavaScript, before any bitwise operation occurs, both operands are normalized.
This means NaN becomes 0.
0 0 xor 0 equals 0.
Как видите, все ненулевые значения преобразуются в 1, а 0 остается равным 0. Это использует тот факт, что в JavaScript NaN^0
равен 0.
Демо-версия:
[0, 1, 19575, -1].forEach(n => console.log('${n} becomes ${n/n^0}.'))
Ответ 3
(((c/c)^c) - c) * (((c/c)^c) - c)
всегда будет возвращать 1 для негативов и позитивов и 0 для 0.
Это определенно более запутанно, чем выбранный ответ и дольше. Тем не менее, я чувствую, что он менее хакерский и не полагается на константы.
РЕДАКТИРОВАТЬ: Как упоминает @JosephSible, более компактная версия моей и @CRice, которая не использует константы:
c/c^c-c
Ответ 4
Очень сложный ответ, но тот, который не зависит от ограниченной точности: если вы возьмете x^(2**n)
, он всегда будет равен x+2**n
если x равен нулю, но он будет равен к x-2**n
если х имеет единицу на n-м месте. Таким образом, для x = 0 (x^(2**n)-x+2**n)/(2**(n+1)
всегда будет 1, но иногда будет нулевым для x! = 0 Так что если вы возьмете произведение (x^(2**n)-x+2**n)/(2**(n+1)
на все n, то XOR, что с 1, вы получите желаемое Функция. Вам придется вручную кодировать каждый фактор, однако. И вам придется изменить это, если вы используете числа с плавающей запятой.
Если у вас есть оператор ==
, то (x==0)^1
работает.