web-dev-qa-db-ja.com

数学演算子*、/、+、 - 、^を使用して、ゼロ以外の数値を1に変換できますか

乗算、除算、減算、加算、XOR(*/-+^)のJavaScript式のみをサポートするソフトウェア(Oracle Siebel)を使用しています。 !? :のような他の演算子を利用できません。

上記の演算子を使用して、数値がゼロ以外の場合は1に変換し、すでにゼロの場合は0のままにすることは可能ですか。数値は、正数、ゼロ、または負数です。

例:

var c = 55;

var d;  // d needs to set as 1

私はc / cを試しましたが、NaNが0の場合はcと評価されます。dが0の場合はcも0である必要があります。

cは通貨値で、最大2桁の末尾桁と12桁の先行桁があります。

数値をブール値の0または1に変換してから、式の他の部分を掛けて、if条件をエミュレートしようとしています。

113
dave

c / (c + 5e-324)は動作するはずです。 (定数5e-324Number.MIN_VALUE で、表現可能な最小の正数です。)xが0の場合、厳密には0で、xがゼロ以外の場合(厳密にはxが4.45014771701440252e-308の場合、最小の非整数)質問で許容されるゼロの数(0.01)は、JavaScriptの浮動小数点演算が1と異なる答えには曖昧すぎるため、厳密に1となります。

144
Joseph Sible

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}.`))
212
CRice

(((c/c)^c) - c) * (((c/c)^c) - c)は、負と正の場合は常に1を返し、0の場合は0を返します。

選択された答えより長くそして間違いなく間違いなくもっと混乱しています。しかし、私はそれがあまり厄介ではなく、定数に頼っていないように感じます。

編集:@JosephSibleが述べているように、私のよりコンパクトなバージョンと定数を使用しない@ CRiceのバージョンは次のとおりです。

c/c^c-c
17
Kyle Wardle

非常に複雑な答えですが、精度には左右されません。x^(2**n)を取ると、xが0の場合は常にx+2**nと等しくなりますが、xの位がnの場合はx-2**nと等しくなります。したがって、x = 0の場合、(x^(2**n)-x+2**n)/(2**(n+1)は常に1になりますが、x!= 0の場合はゼロになることもあります。したがって、すべてのnに対して(x^(2**n)-x+2**n)/(2**(n+1)の積を取ると、XOR 1となるので、目的の関数が得られます。ただし、各要素を手動でコーディングする必要があります。浮動小数点を使用している場合は、これを変更する必要があります。

==演算子があれば、(x==0)^1は機能します。

2
Acccumulation