수학 연산자 *, /, +,-, ^를 사용하여 0이 아닌 숫자를 1로 변환 할 수 있습니까?


118

난 단지 추가, 뺄셈, 곱셈 연산자 자바 스크립트 표현식을 지원하는 분할 소프트웨어 (오라클 시벨)와 함께 작업하고 있어요 XOR ( *, /, -, +, ^). !또는 같은 다른 연산자가 없습니다 ? :.

위의 연산자를 사용하면 숫자가 0이 아니면 1로 변환하고 이미 0이면 0으로 둘 수 있습니까? 숫자는 양수, 0 또는 음수 일 수 있습니다.

예:

var c = 55;

var d;  // d needs to set as 1

나는 시도했다 c / c, 그러나 그것은으로 평가 NaN하면 c0 인 d경우 0을 할 필요가 c0입니다.

c는 통화 값이며 최대 2 개의 후행 숫자와 12 개의 선행 숫자가 있습니다.

if숫자를 부울 0 또는 1로 변환 한 다음 식의 다른 부분을 곱하여 조건 을 에뮬레이션하려고합니다 .


3
의견은 확장 된 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Samuel Liew

10
@SamuelLiew 댓글이 많고 일부는 삭제해야하지만 ( 토론 , 댓글로 답변 ) 대부분은 실제로 설명을 요청합니다 ( :) . XY 문제인지 묻는 댓글 은 경계선입니다.
user202729 2010 년

: 오라클 시벨 숫자 연산자, 지수 것으로 보인다 docs.oracle.com/cd/E95904_01/books/VBLANG/...
데릭 몰러

2
@DerrickMoeller Siebel VB와 Siebel eScript 사이에 차이가있는 것 같습니다. 후자에서는 비트 xor 입니다. 두 가지 중 어느 것이 여기에 적용되는지 잘 모르겠습니다.
CRice 2010 년

3
@ user202729 전체 댓글 스레드가 너무 길어지면 SE 관리자 / 개발자가 만든 모드 인터페이스가 기본 작업이 "채팅으로 이동"또는 "모두 삭제"인 것을 선호하므로 개별적으로 주석을 다르게 처리하지 않을 것입니다. 유용한 댓글이 있으면 질문 자체에서 수정하거나 답변으로 게시해야합니다. 주제에서 벗어난 댓글이있는 경우 자체 정리 / 삭제해야합니다. 이 모드 "기능"및 / 또는 "너무 많은 댓글"중재자가받는 자동 플래그에 대해 논의하고 싶다면 Meta 또는 Meta.SE에 대한 토론을 위해 그것을 가져 오십시오. 감사합니다.
Samuel Liew

답변:


149

c / (c + 5e-324)작동합니다. (상수 5e-324Number.MIN_VALUE표현 가능한 가장 작은 양수입니다.) x가 0이면 정확히 0이고 x가 0이 아닌 경우 (기술적으로 x가 4.45014771701440252e-308 이상이면 0이 아닌 숫자가 질문 0.01, is), JavaScript의 부동 소수점 수학은 답이 1과 다르기에는 너무 부정확하므로 정확히 1로 나옵니다.


1
당신은 영업 이익은 곱하기 0과 1로 노력하고 있기 때문에, 처음으로 bool로하는 표현을 변환해야 other parts of the expression하고, c / (c + 5e-324) * some_expression하지 않습니다 일
phuclv

28
버그를 촬영하고이 기능으로 설정되어
치라 바 티아 - chirag64을

1
@Medinoc 그렇습니다. 그러나 질문은 또한 소수점 뒤에 2 자리를 넘지 않을 것이라고 말합니다. 324는 2보다 훨씬 큽니다.
Joseph Sible-Reinstate Monica

1
흥미롭고 OP에서 작동 할 수도 있지만 팀에서 작업 할 때 이런 종류의 코드를 접하는 것이 정말 싫습니다. 최소한 잘 문서화되고 테스트되어야합니다.
Eric Duminil 2018 년

1
@JosephSible 알아요,하지만 정말 그렇게 생각한다면 가장 분명한 대답은 Number(Boolean(n))연산자를 사용하지 않는입니다. 나는 이것이 OP가 찾고 있던 답이 아니라고 말하지 않았지만 OP가 설명한 질문에 대한 답이 아닙니다. 그래도 질문을 개선해야 할 것입니다.
user5532169

216

표현식을 사용하십시오 n/n^0.

경우 n0이 아닌 :

 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.

n0 인 경우 :

 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.

보시다시피 0이 아닌 모든 값은 1로 변환되고 0은 0으로 유지됩니다. 이것은 JavaScript에서 0이라는 사실을 활용합니다 NaN^0.

데모:

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


45
TIL : Number.NaN ^ n === no_O ( n유한 한 숫자가있는 곳 )
zerkms

17
비트 연산자로 사용하면 NaN편리하게 0으로 변환 되는 것 같습니다 . 참조 : 숫자가 아닌 비트 연산
CRice

3
@zerkms 어쩌면 ~~NaN === 0더 자연스러운 것 같다
BERGI

8
@EnricoBorba 지수 (를 사용 **)가 아니라 비트 별 XOR입니다. 비트 연산은 자바 스크립트에서 매우 낮은 우선 순위를 가지므로 분할이 먼저 발생합니다.
CRice 2010 년

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의 대답을 알지 못했습니다.
Kyle Wardle

2
하지만 상수는 사용하지 않고 연산자와 주어진 변수 만 사용합니다.
L3viathan

2
@JosephSible는 c/c^(c-c)그냥c
Tavian 반스

2
@JosephSible 나는 ^OP "곱하기, 나누기, 빼기, 더하기 및 지수 (*, /,-, +, ^ )"에 의해 암시 된 것처럼 지수로 읽었습니다 . 경우 ^는 자바 스크립트를 우선 순위로 XOR입니다 그럼 내가 틀렸다. OP에 대한 설명을 요청했습니다.
Tavian Barnes

2
@TavianBarnes는 OP가 작성한 것이 아닙니다. 누군가가 질문을 편집했습니다. OP가 실제로 요청한 방식으로 복원했습니다.
Joseph Sible-Reinstate Monica

2

매우 복잡한 대답이지만 제한된 정밀도에 의존하지 않는 대답 :를 취 하면 x가 0이면 x^(2**n)항상 x+2**n같지만 x-2**nx가 n 번째 자리에 1이 있으면 같을 것 입니다. 따라서 x = 0의 경우 (x^(2**n)-x+2**n)/(2**(n+1)항상 1이되지만 x! = 0의 경우 0이되는 경우도 있습니다. 따라서 (x^(2**n)-x+2**n)/(2**(n+1)모든 n 의 곱을 취하면 1로 XOR하면 원하는 기능을 얻을 수 있습니다. 하지만 각 요소를 수동으로 코딩해야합니다. 그리고 부동 소수점을 사용하는 경우이를 수정해야합니다.

==운영자 가 있으면 (x==0)^1작동합니다.


3
어느 쪽 **==사용할 수 없습니다.
Joseph Sible-Reinstate Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.