programing

+0과 -0이 같습니까?

firstcheck 2022. 9. 5. 23:55
반응형

+0과 -0이 같습니까?

ECMAScript 5.1 사양을 읽어보면,+0 ★★★★★★★★★★★★★★★★★」-0별됩니니다다

왜 ㅇㅇ는 거죠?+0 === -0true

JavaScript는 IEEE 754 표준을 사용하여 숫자를 나타냅니다.Wikipedia에서:

부호 0은 연관된 기호와 함께 0입니다.보통 산술에서는 -0 = +0 = 0 입니다.그러나 컴퓨팅에서 일부 숫자 표현은 종종 -0(음수 0) +0(양수 0)으로 나타나는 두 개의 0을 허용합니다.이는 정수의 일부 부호화된 숫자 표현 및 대부분의 부동소수점 숫자 표현에서 발생합니다.숫자 0은 보통 +0으로 인코딩되지만 +0 또는 -0으로 나타낼 수 있습니다.

IEEE 754 부동소수점 산술 표준(현재 부동소수점 숫자를 지원하는 대부분의 컴퓨터와 프로그래밍 언어에서 사용)에는 +0과 -0이 모두 필요합니다.0은 1/-0 = -126 및 1/+0 = +126으로 나누면 ±0/±0 및 ±126/±126에 대해서만 정의되지 않으므로 확장된 실수 라인의 변형으로 간주할 수 있습니다.

이 문서에는 다양한 표현에 대한 자세한 정보가 포함되어 있습니다.

그렇기 때문에 기술적으로 양쪽 0이 구별되어야 합니다.

★★★★★★★★★★★★★★.+0 === -0 true로 합니다. 그런 거야

이 동작은 섹션 11.9.6 '엄격한 동등성 비교 알고리즘'에 명시적으로 정의되어 있습니다(일부 강조).

★★★x === y서, snowledge.x ★★★★★★★★★★★★★★★★★」y값은 참 또는 거짓을 생성합니다.이러한 비교는 다음과 같이 수행됩니다.

(...)

  • Type(x)이 Number일 경우

    1. x가 NaN이면 false를 반환합니다.
    2. y가 NaN이면 false를 반환합니다.
    3. x가 y와 같은 Number 값이면 true를 반환합니다.
    4. x가 +0이고 y가 -0이면 true를 반환합니다.
    5. x가 -0이고 y가 +0이면 true를 반환합니다.
    6. 거짓으로 반환하다.

(...)

(도+0 == -0 (음반)

에 맞는 것 +0 ★★★★★★★★★★★★★★★★★」-0동등하게 합니다.이 점을 으로 그렇게


주의:

ES2015는 새로운 비교 방법인 를 도입했습니다.Object.is -0 ★★★★★★★★★★★★★★★★★」+0:

Object.is(-0, +0); // false

@user113716님의 코멘트를 간과했기 때문에 답변으로 추가하겠습니다.

다음과 같이 하면 -0을 테스트할 수 있습니다.

function isMinusZero(value) {
  return 1/value === -Infinity;
}

isMinusZero(0); // false
isMinusZero(-0); // true

방금 전에 +0과 -0이 실제로 매우 다르게 동작하는 예를 발견했습니다.

Math.atan2(0, 0);  //returns 0
Math.atan2(0, -0); //returns Pi

주의: -0.0001과 같은 음수에 Math.round를 사용하는 경우에도 실제로는 -0이 되며 위와 같이 후속 계산을 망칠 수 있습니다.

이 문제를 해결하기 위한 빠르고 더러운 방법은 다음과 같습니다.

if (x==0) x=0;

또는 그냥:

x+=0;

그러면 -0인 경우 숫자가 +0으로 변환됩니다.

JavaScript에서 숫자 유형을 나타내기 위해 사용되는 IEEE 754 표준에서는 기호가 비트로 표시됩니다(1은 음수를 나타냅니다).

그 결과, 다음과 같은 각 대표 숫자에 대해 음수와 양의 값이 모두 존재합니다.0.

이래서 둘 다-0그리고.+0존재하다.

2021년의 회답

+0과 -0이 같습니까?

간단한 답변:사용하는 비교 연산자에 따라 달라집니다.

장황한 답변:

기본적으로 지금까지의 비교 유형은 4가지입니다.

  1. 평등한
console.log(+0 == -0); // true
  1. 평등한
console.log(+0 === -0); // true
  1. '동일 가치' 평등(ES2015's)
console.log(Object.is(+0, -0)); // false
  1. '동일값 제로' 평등(ES2016)
console.log([+0].includes(-0)); // true

그 결과, 그냥Object.is(+0, -0)다른 것과 차이가 있습니다.

const x = +0, y = -0; // true                -> using ‘loose’ equality
console.log(x === y); // true                -> using ‘strict’ equality
console.log([x].indexOf(y)); // 0 (true)     -> using ‘strict’ equality
console.log(Object.is(x, y)); // false       -> using ‘Same-value’ equality
console.log([x].includes(y)); // true        -> using ‘Same-value-zero’ equality

여기에 이미지 설명 입력

원래 제목에 대한 답변Are +0 and -0 the same?:

brainslugs83(답변 코멘트)Spudley)는 JS의 +0과 -0이 함수와 동일하지 않은 중요한 경우를 지적했다.

var sign = function(x) {
    return 1 / x === 1 / Math.abs(x);
}

이것은 표준이 아닌Math.sign+0과 -0의 올바른 기호를 반환합니다.

사용할 수 있습니다.Object.is+0과 -0을 구별하기 위해, 그리고 하나 더.NaN==NaN.

Object.is(+0,-0) //false

Object.is(NaN,NaN) //true

엄밀한 동등성 비교법(===)이 원인이라고 생각합니다.섹션 4d를 보세요.

규격대한 7.2.13 엄격한 동등성 비교 참조

필요하시면sign지원하는 기능-0그리고.+0:

var sign = x => 1/x > 0 ? +1 : -1;

의 역할을 합니다.Math.sign단,sign(0)돌아온다1그리고.sign(-0)돌아온다-1.

0에는 2개의 값(비트 표현)이 있습니다.이건 특별하지 않아요.특히 부동 소수점 숫자의 경우 이 문제가 발생할 수 있습니다.그것은 부동 소수점 숫자가 실제로 공식의 일종으로 저장되기 때문이다.

정수는 다른 방법으로도 저장할 수 있습니다.추가 부호 비트와 함께 숫자 값을 지정할 수 있으므로 16비트 공간에 15비트 정수 값과 부호 비트를 저장할 수 있습니다.이 표현에서는 값 1000(16진수)과 0000은 모두0이지만, 그 중 하나는 +0이고 다른 하나는 -0입니다.

이것은 정수값에서 1을 빼서 -1 ~ -2^16의 범위를 갖는 것으로 피할 수 있지만, 이것은 불편합니다.

보다 일반적인 접근법은 정수를 '2개의 보완'에 저장하는 것이지만 ECMAscript는 정수를 저장하지 않기로 선택한 것으로 보입니다.이 방법에서는 0000 ~7FFF의 플러스 값 범위입니다.음수는 FFFF(-1) ~8000부터 시작합니다.

물론 더 큰 정수에도 같은 규칙이 적용되지만, 나는 내 F가 닳는 것을 원하지 않는다.;)

위키피디아에는 이 현상을 설명하는 좋은 글이 있습니다.http://en.wikipedia.org/wiki/Signed_zero

즉, +0과 -0은 모두 IEEE 부동소수점 사양에 정의되어 있습니다.둘 다 기술적으로 부호 없는 0과 정수이지만 실제로는 모두 0으로 평가되기 때문에 실질적으로 그 구별은 무시될 수 있습니다.

언급URL : https://stackoverflow.com/questions/7223359/are-0-and-0-the-same

반응형