본문 바로가기

개발/Javascript

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

반응형

+0과 -0 알아보기

수학적으로 0은 음수와 양수의 사이에 차이가 없기 때문에 같은 값으로 봅니다.

하지만 컴퓨터 세계에서는 +0-0은 엄밀히 말하면 다릅니다.


javascript 콘솔에서 -0을 입력하면 -0을 반환합니다.

즉, +0과 구분되는 -0이 존재한다는 것이죠.


+01을 곱하거나 나누었을 때는 +0을 반환합니다.

반면 -01을 곱하거나 나누었을 때 -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은 같은 값이지만, 차이도 분명 존재합니다. 

 

 

10으로 나눌 수 없기 때문에 그 값은 무한이 됩니다.

이때 +0으로 나누었을 땐 양수무한, -0으로 나누었을 땐 음수무한이 됩니다.

분명 같은 값을 가졌지만, 분모가 되었을 땐 무한의 차이가 발생해요.


javascript에서 가장 엄격한 비교를 수행하는 Object.is()를 사용하여

+0-0을 비교하면 false를 반환합니다.


+0과 -0 차이 정리

  • javascript는 IEEE754 표준에 따라 십진수를 부동소수점으로 변환하여 숫자를 저장한다. 
  • 변환된 부동소수점의 첫 번째 비트는 부호를 저장한다. 
  • +0을 입력하면 맨 앞 비트는 0이 되고, -0을 입력하면 맨 앞 비트는 1이 된다.
  • +0과 -0은 일치 비교(===)하면 true를 반환한다.
  • +0-0Object.is()로 비교하면 false를 반환한다.

 

0.1 + 0.2 은 0.3이 아니다

0.1 + 0.20.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

 

반응형