본문 바로가기

공부/TIL

배정밀도 64비트 부동소수점 형식의 2진수

console.log(0.1+0.2) 결괏값이 무엇일까요?

 

콘솔창에 0.1 + 0.2를 출력한모습
결과

console.log(0.1 + 0.2 === 0.3) 결괏값은 무엇일까요?

 

0.1 + 0.2 는 0.3과 같지 않다!?

 

0.3을 예상한 것과 다르게 알 수 없는 값이 나온 후 undefined라는 완료 값이 나옵니다.

 

완료 값이란? https://hbsowo58.tistory.com/459

 

완료값에 대하여

완료 값에 대한 질문을 받았는데, '표현식이 아닌 문은 언제나 undefined를 출력한다' 호이 스팅 관련인 줄 알았는데, '선언문'과 '표현식', '값'과 '평가'에 대한 이해가 필요한 문제였습니다.

hbsowo58.tistory.com

 

0.1과 0.2를 더한 값을 0.3 같으냐를 물으면 false라는 기적의 결과가 나타납니다.

 


 

자바스크립트에서 데이터 타입은 총 7가지가 있고, 두 가지로 구분하면 원시 타입/객체 타입이 있습니다.

 

원시 타입 중, 숫자(number) 타입의 정수, 실수, 2진수, 8진수, 16진수, 리터럴 등은 

 

배정밀도 64비트 부동소수점 형식의 2진수로 저장됩니다.

 

크게 나눠서 배정밀도/단정밀도 2가지, 부동소수점/고정소수점으로 나뉘는데 (배정밀도가 64비트 단정밀도가 32비트)

 

부동소수점이란?

 

 

참고 그림

 

 

 

그림을 보면, 4가지 경우의 수가 존재하고, 자바스크립트는 64비트 부동소수점을 사용합니다.

 

단, 자바스크립트는 모든 number를 실수로 저장합니다.

 

->그렇게 했기때문에 맨 처음 제시한 문제가 발생하는 것입니다.

 

부동 소수점이란 고정소수점과 비교하여, 부동 (소수점이 움직인다라고 이해해야 합니다) 둥둥 떠다닌다는 뜻입니다.

 

이는 나중에 2진수 표현방식이 될 것입니다.

 

 

몇 개만 이진수로 간단하게 변경해보겠습니다.

 

12 -> 1100(2)

 

69.25 -> 1000101.01(2)

 

이것을 소수점을 변경시켜 정규화시키는데 (소수점 왼쪽에 위치한 가수 부분을 밑수보다 작은 자연수가 되도록 만들기)

 

1.100 x 2^3

1.00010101 x 2^6 

 

정규화시킨 소수점 뒷부분을 가수라고 하고, 지수 계산식은 (서칭 바람)

 

64비트 부동소수점으로 변경하면

 

1비트(부호) / 11비트 (지수) / 52비트 (가수)

0              / 10000000010 / 100 나머지 0으로 

양수 0

음수 1

 

 

 

지수부를 채우는 방법은 (배리어스 값 + 지수의 승수) 1023+3 = 1026 지수부 2 진화 소수점 뒤는 소수점 그대로

 

0/ 10000000101 / 00010101 -> 나머지 0으로 

 

 

이런 식으로 메모리에 적재되는 방식을 부동소수점이라 하며

 

비순환 소수 등에서 문제점이 발생해서,

 

이를 십진화 할 때 오차가 발생하여 같지 않다고 나오게 됩니다.

 

 

반응형

'공부 > TIL' 카테고리의 다른 글

코딩 테스트 치트리스트  (0) 2020.10.09
사람이 다른 동물과 구별되는 점은?  (0) 2020.04.28
완료값에 대하여  (0) 2020.04.20
커밋 메시지  (0) 2020.04.20
package-lock.json  (0) 2020.04.14