위 수식이 false인 이유를 알아보기 전에, 우리의 컴퓨터가 실수를 표현하는 원리에 대해 알아보면 좋을 것 같다.
컴퓨터는 0과 1로 이루어진 2진법으로 데이터를 저장한다.
그리고, 정수뿐만 아니라 소수가 포함된 실수또한 2진법으로 저장해야한다.
이렇게 실수를 표현하는 방식은 두 가지로 나뉜다.
고정 소수점 방식과 부동 소수점 방식
고정 소수점 방식(fixed-point)
고정 소수점 방식은 메모리를 정수부와 소수부로 고정으로 나눈다.
소수부의 자릿수를 미리 정하고 고정된 자릿수의 소수를 표현하기 때문에 직관적이다.
직관적이나, 표현가능범위가 매우 작다.
컴퓨터는 효율성과 공간낭비방지를 위해 부동 소수점 방식을 사용한다.
부동 소수점 방식(floating-point)
부동 소수점은 고정 소수점 방식과는 달리 메모리를 가수부(23bit)와 지수부(8bit)로 나눈다.
위의 고정 소수점 방식에서는 따로 물리적으로 정수부와 소수부로 나누어 각각 15bit, 16bit 밖에 사용하지 못하였지만, 부동소수점 방식은 실수의 값 자체를 가수부(23bit)에 넣어 표현하기 때문에 보다 큰 비트의 범위를 가지게 되며, 정수부가 크든 소수부가 크든 상관없이 가수부 내에서 전체 실수를 표현하기 때문에 공간 낭비 문제도 해결되는 것이다.
결국 32칸으로 실수를 표현하는 것인데, 32칸을 넘어가서 표현이 된다면?
컴퓨터의 메모리는 한정적이고, 메모리 한계까지 이어지는 무한소수와 같은 경우에는 컴퓨터가 어느 부분에서 끊고 반올림을 해준다. 이 부분에서 우리가 생각하는 값과 컴퓨터가 표현하는 값의 차이가 발생한다.
이러한 오차로 인하여 실제로 미국 패트리어트 미사일이 잘못 요격되어, 100여명의 사람들이 죽었다고 한다.
(매 연산마다 짤린 소수점만큼의 오차가 누적되어, 다른 결과를 초래한 것)
이와 관련된 개념으로 머신입실론도 한 번 검색해서 알고가면 좋을 것 같다.
'Javascript' 카테고리의 다른 글
객체에 키값 동적으로 할당하기 (0) | 2022.11.13 |
---|---|
addEventListener 사용법 (0) | 2022.11.10 |
JavaScript의 ES란?, ES5/ES6 문법 차이 (1) | 2022.10.08 |
자바스크립트 동기와 비동기 (1) | 2022.10.08 |
호이스팅과 TDZ (0) | 2022.09.29 |