아무튼 개발
article thumbnail
반응형

Javascript에서 숫자는 64비트 부동소수점 형식으로 저장된다.

 

64비트 부동소수점이 어떤 건지 알아야

0.1 + 0.2 === 0.3 이 오류라는 것을 이해할 수 있다!

 

64비트 부동소수점이 어떤건지 각각의 단어를 먼저 나눠서 살펴보자 🧐

 

 

64비트

 

자바의 경우, int, char, float 등 숫자 하나에도 여러 타입을 지닌다.

자바스크립트는 다른 언어와 다르게 숫자는 number 타입 하나로만 다루고 있다.

number 타입은 64비트의 고정된 크기 공간을 가지고 있다.

 

사람은 숫자를 10진법, 컴퓨터는 2진법으로 표현한다.

컴퓨터는 모든 데이터를 0, 1로 이루어진 이진수로 처리한다. 그래서 하나의 비트(bit)는 0 또는 1의 값을 지닌다.

 

 

부동소수점

 

뜰 부, 움직일 동 (浮動)

Floating Point

또는 떠돌이 소수점.

 

부동소수점은 매우 큰/작은 숫자를 효율적으로 표현하기 위한 방법이다.

뜻을 해석하자면 “소수점이 위치를 떠다닌다” 라는 말이며,

숫자의 크기에 따라 소수점의 위치가 변동한다는 것이다.

대표적으로 자바, 파이썬의 float, 자바스크립트의 number 타입이 사용하고 있다.

 

 

64비트의 부동소수점 숫자?

 

위 두 단어의 개념을 알았으니

이를 합쳐서 부동소수점 숫자를 64비트로 표현하는 방식을 알아보자!

 

Sign Bit (부호 비트)

  • 숫자가 양수인지 음수인지 표현
  • 0: 양수, 1: 음수

Exponent (지수)

  • 소수점이 어디 위치에 있는지 결정
  • 소수점이 움직일 칸의 개수 나타냄

Mantissa (가수)

  • 숫자의 유효숫자

 

출처: 위키백과

 

64비트 중에서 각각 부호 비트는 1비트, 지수는 11비트, 가수는 52비트를 차지한다.

 

9.625를 예시로 부동소수점에 대해 알아보자

9.625 를 2진수로 표현 ⇒ 1001.101
9 ⇒ 1001
0.625 ⇒ 101

 

부동소수점은 모든 숫자를 1.xxx 형식으로 변환한다.

따라서 이진수로 표현된 1001.101를 1.001101로 변환시키려면

 

소수점이 왼쪽으로 3칸 이동해야 한다. => 지수

소수점이 움직이기 때문에 => 부동

나머지 52비트는 소수점이 움직인 결과 (1.001101)를 기준으로, 소수점 뒷부분의 값들을 채워 넣는 것 => 가수

 

유효 숫자가 52비트를 넘어가게 되면 반올림을 해서 저장한다

즉, 정확한 숫자가 아닌 근사치를 얻게 된다

 

 

이러한 자바스크립트의 특성을 알게 되면

이제 소수점과 같은 숫자 계산시, 조심하여 값을 다룰 수 있게 된다!

 

 


 

CF)

https://medium.com/@syalot005006/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%8B%A4%EC%88%98-%EA%B3%84%EC%82%B0-%EC%98%A4%EB%A5%98-a72ec3326b50

 

자바스크립트의 실수 계산 오류

자바스크립트에서 0.1과 0.2를 더하면 0.3이 아닌 0.30000000000000004가 나온다. 도대체 왜 이럴까?

medium.com

 

https://www.youtube.com/watch?v=ZQDsWySjY6g

반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...