본문 바로가기

개발/Javascript

[Javascript] 양수0, 음수0 차이 쉽게 이해하기

반응형

+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표준을 따라 처리한다.

 

 

이 글의 제목이 쉽게 이해하기이기 때문에

십진수을 어떻게 부동소수점으로 변환하는지는 다루지 않을 거예요.

(우리에겐 변환하는 방식이 중요한 게 아니니까요!)


위키피디아 Double-precision_floating-point_format

설명을 위해 컴퓨터에서 부동소수점이 어떤 모습으로 저장되는지 이미지를 가져와봤어요.

구조에 대해 자세히 알 필요는 없고, 중요한 것은 가장 앞에 있는 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] 0.1 + 0.2가 0.3이 아닌 이유 쉽게 이해하기

지난 글 복습하기지난 포스팅에서 javascript에서 `-0`이 존재하는 이유에 대해 알아보았어요.[양수 0, 음수 0 차이 쉽게 이해하기] 위의 글에서 이야기했던 `-0`이 존재하는 이유와 오늘 글의 주제와

shelly-log.tistory.com

 

반응형