可以使用数学运算符 *、/、+、-、^ 将非零数字转换为 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-324
是 Number.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