可以使用数学运算符 *、/、+、-、^ 将非零数字转换为 1 吗?

Can mathematical operators *, /, +, -, ^ be used to convert a non-zero number to 1?

我使用的软件 (Oracle Siebel) 仅支持 JavaScript 表达式,其中包含乘法、除法、减法、加法和异或运算符(*/-+^)。我没有其他可用的运算符,例如 !? :

使用上述运算符,是否可以将非零数字转换为 1,如果已经为零则保留为 0?该数字可以是正数、零或负数。

示例:

var c = 55;

var d;  // d needs to set as 1

我试过 c / c ,但当 c 为 0 时,它的计算结果为 NaN。当 c 为 0 时,d 需要为 0。

c是一个货币值,它最多有两个尾随数字和12个前导数字。

我试图通过将数字转换为布尔值 0 或 1,然后乘以表达式的其他部分来模拟 if 条件。

c / (c + 5e-324) 应该可以。 (常数 5e-324Number.MIN_VALUE,最小的可表示正数。)如果 x 为 0,则正好为 0,并且如果 x 不为零(从技术上讲,如果 x 至少为 4.45014771701440252e-308,问题中允许的最小非零数 0.01 是),JavaScript 的浮点数学计算过于不精确,答案与 1 不同,所以它会正好是 1.

使用表达式 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}.`))

一个非常复杂的答案,但它不依赖于有限的精度:如果你取 x^(2**n),如果 x 为零,这将始终等于 x+2**n,但它将是等于 x-2**n 如果 x 在第 n 位有一个 1。因此,对于 x=0,(x^(2**n)-x+2**n)/(2**(n+1) 将始终为 1,但对于 x!=0,它有时会为零。因此,如果您对所有 n 取 (x^(2**n)-x+2**n)/(2**(n+1) 的乘积,然后将其与 1 进行异或,您将获得所需的函数。不过,您必须手动对每个因素进行编码。如果您使用浮点数,则必须修改它。

如果您有 == 运算符,则 (x==0)^1 有效。

(((c/c)^c) - c) * (((c/c)^c) - c) 总是 return 1 表示负数和正数,0 表示 0。

肯定比选择的答案更混乱,更长。但是,我觉得它不那么 hacky 并且不依赖常量。

编辑:正如@JosephSible 提到的,我的更紧凑版本和不使用常量的@CRice 版本是:

c/c^c-c