2.3.2 작은 소수 값

jude·2022년 1월 30일
0

you don't know js

목록 보기
10/30
post-thumbnail

부동 소수점 숫자의 부작용
자바스크립트는 현대의 대부분의 프로그래밍 언어들과 마찬가지로 'IEEE 754'표준(부동 소수점 표준)을 따르는데 이는 부동 소수점 계산에 이슈가 생긴다.

0.1 + 0.2; // 0.30000000000000004
0.1 + 0.2 === 0.3; // false

만약 이렇게 소수점 계산을 하고나서 같은지 체크를 하고 싶을 때가 있는데, 상식적으로 사람이 생각한 것과 다른 결과값이 나오기 때문에 저 문제를 해결하는 방법이 필요하다.
이럴 때 Number.EPSILON 을 사용한다.

function numbersCloseEnoughToEqual(a, b) {
  return Math.abs(a - b) < Number.EPSILON;
}
let a = 0.1 + 0.2;
let b = 0.3;

numbersCloseEnoughToEqual(a, b); // true
numbersCloseEnoughToEqual(0.0000001, 0.0000002); // false

Number.EPSILON 폴리필

if (!Number.EPSILON) {
	Number.EPSILON = Math.pow(2,-52);
}

주석 앞에 숫자 클수록 큰 수

// 3 - 컴퓨터가 이해할 수 있는 가장 작은 숫자 단위
Number.EPSILON; // 2.220446049250313e-16

// 5 - 표현할 수 있는 가장 큰 양수 값
Number.MAX_VALUE; // 1.7976931348623157e+308

// 2 - 표현할 수 있는 가장 작은 양수 값
Number.MIN_VALUE; // 5e-324

// 4 - 안전하게 표현할 수 있는 가장 큰 정수 값
Number.MAX_SAFE_INTEGER; // 9007199254740991

// 1 - 안전하게 표현할 수 있는 가장 작은 정수 값
Number.MIN_SAFE_INTEGER; // -9007199254740991

// 크기 비교
const Num = Number;
Num.MIN_SAFE_INTEGER < Num.MIN_VALUE < Num.EPSILON < Num.MAX_SAFE_INTEGER < Num.MAX_VALUE

// 안전하게 표현할 수 있는 수를 넘어가면 오작동한다.
Num.MAX_SAFE_INTEGER + 2 === Num.MAX_SAFE_INTEGER + 1; // true
profile
UI 화면 만드는걸 좋아하는 UI개발자입니다. 프론트엔드 개발 공부 중입니다. 공부한 부분을 블로그로 간략히 정리하는 편입니다.

1개의 댓글

comment-user-thumbnail
2022년 1월 31일

사실 Number.EPSILON의 의미가 잘 이해가 되지 않습니다.
구글링을 아무리 해봐도 그냥 책에 나와있는 부분을 설명해 놓았을 뿐. 검증을 통해 제대로 이해시킬 수 있는 글들을 못찾은거 같아요.
Low 레벨 개념까지 들어가야 해서 그런 걸까요.
어렵네요.
누가 명쾌하게 설명해주실 수 있는 분은 답글 부탁드립니다.

답글 달기