Можно ли использовать математические операторы *,/, +, -, ^ для преобразования ненулевого числа в 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 работает.