+0과 -0이 같습니까?
ECMAScript 5.1 사양을 읽어보면,+0
★★★★★★★★★★★★★★★★★」-0
별됩니니다다
왜 ㅇㅇ는 거죠?+0 === -0
true
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일 경우
- x가 NaN이면 false를 반환합니다.
- y가 NaN이면 false를 반환합니다.
- x가 y와 같은 Number 값이면 true를 반환합니다.
- x가 +0이고 y가 -0이면 true를 반환합니다.
- x가 -0이고 y가 +0이면 true를 반환합니다.
- 거짓으로 반환하다.
(...)
(도+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가지입니다.
- 평등한 것
console.log(+0 == -0); // true
- 평등한 것
console.log(+0 === -0); // true
console.log(Object.is(+0, -0)); // false
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
'programing' 카테고리의 다른 글
함수를 PHP 배열에 저장할 수 있습니까? (0) | 2022.09.05 |
---|---|
Vuevalidate 비동기 유효성 검사 결과가 루프로 전환됨 (0) | 2022.09.05 |
파일이 존재하는 경우 File.exists()가 false를 반환합니다. (0) | 2022.09.05 |
부울 객체를 Java 문자열로 변환하는 최선의 방법 (0) | 2022.09.05 |
Mysql 케이스 문이 작동하지 않습니다. (0) | 2022.09.05 |