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


118

私は、唯一の乗算演算子でJavaScript式をサポートしているソフトウェア(オラクルのSiebel)と協力除算、減算、追加、およびXOR(AM */-+^)。!またはのような他の演算子はありませ? :ん。

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

例:

var c = 55;

var d;  // d needs to set as 1

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

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

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


3
コメントは拡張ディスカッション用ではありません。この会話はチャットに移動さました
サミュエルLiew

10
@SamuelLiew多くのコメントがあり、それらのいくつかは削除する必要があります(ディスカッションコメント回答)が、それらのほとんどは実際に説明を求めています(たとえば)。XY問題かどうかを尋ねるコメントは境界線です。
user202729 2018年

オラクルのSiebel数値演算子は、指数のようだ:docs.oracle.com/cd/E95904_01/books/VBLANG/...
デリック・メラー

2
@DerrickMoeller Siebel VBとSiebel eScriptには違いがあるようです。後者では、ビット単位のxorです。ここでどちらが当てはまるかはわかりません。
CRice

3
@ user202729コメントスレッド全体が長くなりすぎた場合、SE管理者/開発者が作成したmodインターフェースはデフォルトのアクションが「チャットに移動」または「すべて削除」のいずれかであるので、コメントを個別に処理することはしません。コメントが役立つ場合は、質問自体に編集するか、回答として投稿する必要があります。トピックから外れているコメントがある場合、それらは自己整理または削除されているはずです。このmodの「機能」やモデレーターが取得する「コメントが多すぎます」という自動フラグについて話し合いたい場合は、MetaまたはMeta.SEでの議論のために取り上げてください。ありがとうございました。
サミュエルLiew

回答:


149

c / (c + 5e-324)うまくいくはずです。(定数5e-324Number.MIN_VALUEであり、表現可能な最小の正数です。)xが0の場合、それは正確に0であり、xが非ゼロの場合(技術的には、xが少なくとも4.45014771701440252e-308の場合、質問、0.01、です)、JavaScriptの浮動小数点演算は不正確すぎて、答えが1と異なるため、正確に1として返されます。


1
あなたはOPは0と1を乗算しようとしているので、最初のBOOLする式を変換する必要がありother parts of the expression、かつc / (c + 5e-324) * some_expression動作しません
phuclv

28
バグを取って、そこの機能にそれを回した
チラグバティア- chirag64を

1
@Medinocはい、しかし問題も小数点以下2桁以上は存在しないことを言って、そして324は、より多くの2以上である
ジョセフSible-復活モニカ

1
それは興味深いものであり、OPでも機能する可能性がありますが、チームで作業しているときにこの種のコードに遭遇するのは本当に嫌です。少なくとも、十分に文書化され、テストされている必要があります。
エリックドゥミニル2018年

1
@JosephSible知っていますが、実際にそのように考える場合Number(Boolean(n))、最も明白な答えはであり、演算子を使用しません。これはOPが求めていた答えではないとは言いませんでしたが、これはOPが説明した質問に対する答えではありません。おそらく問題を改善する必要があります。
user5532169 2018年

216

式を使用します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のままNaN^0です。これは、JavaScriptでは0 であることを利用しています。

デモ:

[0, 1, 19575, -1].forEach(n => console.log(`${n} becomes ${n/n^0}.`))


45
TIL:Number.NaN ^ n === no_O(n有限数)
zerkms '25年

17
ビット単位のオペランドとして使用すると、NaN便利にゼロに変換されるようです。参照:非数値のビット単位演算
CRice

3
@zerkms多分~~NaN === 0もっと自然に見えるかもしれません
ベルギ

8
@EnricoBorba指数演算ではありません(これはを使用します**)。ビット単位のXORです。JavaScriptでのビット演算の優先度は非常に低いため、除算が最初に行われます。
CRice

3
^ビットごとのxor演算子です。^他のすべての演算子が算術演算子である場合、OPがビット単位のxorであるかどうかは疑問です。おそらく指数演算子(**JavaScriptの場合)です。
Salman A

17

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

これは、選択した回答よりも紛らわしく、長くなります。ただし、ハックが少なく、定数に依存していないように感じます。

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

c/c^c-c

CRiceの答えは選ばれませんでした、Joseph Sibleが選ばれました。正直なところ、投稿した後まで、私はCRiceの答えに気づきませんでした。
カイルウォードル2018年

2
ただし、定数は使用せず、演算子と指定された変数のみを使用します。
L3viathan 2018年

2
@JosephSible c/c^(c-c)はちょうどですc
Barnes

2
@JosephSible ^OPで示されているように、指数として解釈していた「乗算、除算、減算、加算、および指数(*、/、-、+、^)」。^JavaScript優先のXORである場合、私は誤りです。OPの説明を求めました。
Tavian Barnes、

2
OPが書いたものではない@TavianBarnes。誰かが質問を編集しました。OPが実際に尋ねた方法に復元しました。
ジョセフ・サイブル復職モニカ

2

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

あなたが==演算子を持っている場合は、(x==0)^1機能します。


3
どちら**==利用できません。
ジョセフ・サイブル復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.