부동 소수점 방식 이해하기
-
지수 표기법
console.log(1.123E+5);
// 112300
console.log(1.123e-5);
// 0.00001123
console.log(1e20);
// 100000000000000000000
console.log(1e21);
// 1e+21
console.log(1e308);
// 1e+308
console.log(1e309);
// Infinity
-
43.6785를 64 비트 IEEE 754 형식 부동 소수점으로 표현
- 2진수로 바꾸면 101011.1011(2)
- 부호부는 양수니까 0
- 일단 정규화 과정 거친다 (1 하나가 맨 앞으로 나오도록)
- 예를 들면 0.001101(2) 는 1.101 * 2^-3 으로 변환
- 101011.1011(2) 는 1.010111011 * 2^5 로 정규화
- 가수부는 남은 뒤부분 다 0으로 채운다
- .010111011 에서 010111011.....0000 (52까지)
- 지수부는 bias를 더해야 된다
- bias 는 지수부의 bit 수 n (11) 2^(n-1) - 1을 더한다
- 더하는 이유는 음의 지수값도 양수로 표현해서 빠르게 계산하기 위함
- 5 + (2^10 - 1) = 1028
- 10000000100(2)
- 완성 0 10000000100 010111011.....0000
부동소수점 방식의 JS 소수 탐구
0.1 + 0.2 !== 0.3
- 자바스크립트에서 숫자는 '64 비트 IEEE 754 형식'
- 우리가 수를 입력하면 2진법으로 바꿨다가 다시 10진법으로 바꿔서 출력한다
- 소수의 경우 2진법으로 바꿀시 분모가 2의 거듭제곱의 수가 아니면 2진법 무한 소수가 된다
- 이를 해결하기위해서 64 비트 IEEE 754 형식 에서는 정해진 비트 수((부호 1bit, 지수부 11bit, 가수부 52bit)) 안에서 반올림을 하게된다
- 지수부를 넘어가면 오버플로우가 발생하고 가수부를 넘어가면 오차가 발생한다
- 0.1 + 0.2와 0.3은 다른 수다
- 0.1의 반올림 값 + 0.2의 반올림 값
- 0.3의 반올림 값
정수 탐구
(2^53 - 1)부터 2^53 - 1 사이의 수 까지 표현가능
- 64 비트 IEEE 754 형식 에서는 -(2^53 - 1)부터 2^53 - 1 사이의 수가 안전
- 가장 큰 정수 9007199254740991
- 가장 작은 정수 -9007199254740991
console.log(Number.MAX_SAFE_INTEGER);
// 9007199254740991
console.log(Number.MIN_SAFE_INTEGER);
// -9007199254740991
정확한 연산 결과 얻는 방법
숫자 비교를 위해 Number.EPSILON 이용
- Number.EPSILON 은 double 형 부동 소수점 가수부에서 0을 제외하고는 가장 작은 수