+0과 -0 알아보기
수학적으로 0은 음수와 양수의 사이에 차이가 없기 때문에 같은 값으로 봅니다.
하지만 컴퓨터 세계에서는 `+0`과 `-0`은 엄밀히 말하면 다릅니다.
javascript 콘솔에서 `-0`을 입력하면 `-0`을 반환합니다.
즉, `+0`과 구분되는 `-0`이 존재한다는 것이죠.
`+0`과 `1`을 곱하거나 나누었을 때는 `+0`을 반환합니다.
반면 `-0`과 `1`을 곱하거나 나누었을 때 `-0`을 반환해요.
`+0`과 `-0`을 비교해 보면 `true`를 반환합니다.
그렇다면 `+0`과 `-0`은 왜 구분되어 있을까요?
+0과 -0를 구분하는 이유
우리가 실생활에서 사용하는 숫자 표기법은 0부터 9까지 사용하는 십진법입니다.
컴퓨터가 사용하는 숫자 표기법은 0과 1을 사용하는 이진법입니다.
우리가 컴퓨터에게 십진수를 입력했을 때, 컴퓨터는 이진수로 변환하여 값을 인식해요.
컴퓨터는 `1`, `2`, `3`과 같은 정수 뿐만 아니라 `0.1`, `0.4`와 같은 소수점도 이해할 수 있어야 하기 때문에
이진수로 소수를 표현할 수 있는 부동소수점의 형태로 저장하고 있어요.
컴퓨터에서 부동소수점을 저장할 때 컴퓨터 천재들이 정한 IEEE754표준에 따라서 처리하고,
javascript 또한 IEEE754표준을 따릅니다. [ECMA 링크]
(정확히 말하면 전기전자공학자협회에서 만든 표준인데, 협회에 계신 분들은 모두 컴퓨터 천재일테니 틀린 말은 아니죠?ㅎ)
잠깐 정리하고 넘어가기!
- 사람이 십진수를 입력했을 때, 컴퓨터는 부동소수점으로 변환하여 처리한다.
- 부동소수점란? 이진수로 소수점을 표현할 수 있는 형태이다.
- 컴퓨터에서 부동소수점을 처리할 때 IEEE754표준을 따라 처리한다.
이 글의 제목이 쉽게 이해하기이기 때문에
십진수을 어떻게 부동소수점으로 변환하는지는 다루지 않을 거예요.
(우리에겐 변환하는 방식이 중요한 게 아니니까요!)
설명을 위해 컴퓨터에서 부동소수점이 어떤 모습으로 저장되는지 이미지를 가져와봤어요.
구조에 대해 자세히 알 필요는 없고, 중요한 것은 가장 앞에 있는 sign 비트입니다.
sign 비트는 값이 음수인지 양수인지 저장하는 역할을 합니다.
양수라면 0을 저장하고 음수라면 1을 저장해요.
`+0`을 입력했을 때는 sign 비트가 `0`이 될 것이고,
`-0`을 입력했을 때는 sign 비트가 `1`이 되겠죠!
이 차이로 인해 `+0`과 `-0`이 구분되는 것입니다.
사실 `+0`과 `-0`을 구분하는 이유라는 건 없지만,
javascript가 부동소수점으로 변환하여 숫자를 저장하다 보니 `+0`과 `-0`이 구분된 것 입니다!
+0과 -0의 차이
`+0`과 `-0`은 같은 값이지만, 차이도 분명 존재합니다.
`1`을 `0`으로 나눌 수 없기 때문에 그 값은 무한이 됩니다.
이때 `+0`으로 나누었을 땐 양수무한, `-0`으로 나누었을 땐 음수무한이 됩니다.
분명 같은 값을 가졌지만, 분모가 되었을 땐 무한의 차이가 발생해요.
javascript에서 가장 엄격한 비교를 수행하는 `Object.is()`를 사용하여
`+0`과 `-0`을 비교하면 `false`를 반환합니다.
+0과 -0 차이 정리
- javascript는 IEEE754 표준에 따라 십진수를 부동소수점으로 변환하여 숫자를 저장한다.
- 변환된 부동소수점의 첫 번째 비트는 부호를 저장한다.
- `+0`을 입력하면 맨 앞 비트는 `0`이 되고, `-0`을 입력하면 맨 앞 비트는 `1`이 된다.
- `+0`과 -0은 일치 비교
(===)하면 `true`를 반환한다. - `+0`과 `-0`을 `Object.is()`로 비교하면 `false`를 반환한다.
0.1 + 0.2 은 0.3이 아니다
`0.1 + 0.2`과 `0.3`을 비교하면 `false`를 반환합니다.(???)
`0.1 + 0.2`의 값을 찍어보니 `0.30000000000000004`를 반환하는군요.
이 또한 숫자를 IEEE754표준에 따라 저장하면서 발생하는 현상입니다.
궁금하신 분들은 추천글을 확인해주세요!
추천글
'개발 > Javascript' 카테고리의 다른 글
[Javascript] NaN 알아보기 (0) | 2024.07.02 |
---|---|
[Javascript] 0.1 + 0.2가 0.3이 아닌 이유 쉽게 이해하기 (0) | 2024.06.23 |
[Javascript] 스크롤 이벤트로 비디오 재생 | 클론코딩 | 인터렉티브 웹 (0) | 2023.11.06 |
[Javascript] Hash 란? (0) | 2022.09.26 |
[토스페이먼츠 / Javascript] 자동 결제 연동하기 - SDK 결제창 이용 (0) | 2022.08.16 |