밑이 10인 실수에는 10진 소수점이 포함되는데, 밑이 2인 경우에는 2진 소수점을 어떤 방법으로 표현할 수 있을까? 2진수로 수를 표현하는 일반적인 방식들에 대해 알아보자.
고정소수점 표현법
- 2진 소수점의 위치를 임의로 정하는 방법
- 소수점을 기준으로 왼쪽에 있는 비트들은 정수 부분을 나타내고 오른쪽에 있는 비트들은 분수 부분을 나타냄.
- 소수점의 위치가 항상 일정하므로 고정소수점(fixed-point) 표현법이라고 함.
- 고정소수점 표현법은 넓은 범위의 수를 나타내기 위해 너무 많은 비트를 필요로 하므로 범용 컴퓨터에서는 잘 사용하지 않는 방법임.
- 비트가 많이 필요하다는 것은 곧 메모리 비용이 많이 든다는 것
- DSP(digital signal processor) 등 일부 컴퓨터에서는 사용하기도 함.
부동소수점 표현법
- 넓은 범위의 수를 표현하기 위해 과학적 표기법(scientific notation)을 2진수에 적용
- 과학적 표기법에선 10진 소수점 왼쪽이 한 자리뿐인 소수에 10을 몇 번 거듭제곱한 값을 곱하는 방식으로 소수를 표현함.
- 2진법으로 표기할 때는 10이 아닌 2를 밑으로 한다는 점만 다름. 즉, 가수(mantissa) 부분은 2진 소수, 지수 부분은 2의 거듭제곱 횟수를 표현함. 이러한 방법을 부동소수점(floating-point) 표현법이라고 함.
- 부동소수점 수의 정의상 밑 2는 항상 정해져 있음.
- 부동소수점 표현법은 지수, 가수를 분리함으로써 수를 나타내는 데 필요한 0을 메모리에 모두 저장하지 않고도 수를 표현할 수 있음.
- 문제점: 비트 조합 중엔 중복되는 것들이 많음. 예를 들어 4비트 부동소수점 방식으론 0을 표현하는 방법이 4가지나 존재함. 즉 낭비되는 부분이 많음. 또한, 비트 패턴이 가능한 모든 수를 표현하지 못함.
IEEE 부동소수점 수 표준
- 문제점이 존재하긴 하지만 이러한 부동소수점 방법이 바로 컴퓨터에서 실수를 표현하는 표준 방법임.
- 가수와 지수 각각 부호 비트를 사용함.
- 가수의 부호 비트는 Sign이라고 하며 MSB(Most Significant Bit)에서 0(양수) 또는 1(음수)를 통해 나타냄.
- 지수 부호 비트의 경우 지수 비트 패턴에 감춰져 있음.
- IEEE 754라는 표준에 정의되어 있는 기능들을 통해, 낭비되는 비트 조합을 최소화하고 반올림을 용이하게 함. 또한 여러가지 특별한 비트 패턴(양의 무한대, 음의 무한대, NaN를 나타내는 비트 패턴)을 제공하므로 편리함.
- IEEE: 미국 전자전기공학화의 약자로, 표준 제정 등을 하는 전문가 조직
- 정밀도(precision)를 높이기 위해 정규화(nomalization)를 사용함.
- 정밀도는 실수를 얼마나 정확하게 저장할 수 있는지에 대한 정도를 나타냄.
- 다음의 두 가지 부동소수점 수가 자주 사용됨.
- 기본 정밀도(single precision) 부동소수점 수 ☞ 단정도 실수
- 32비트를 사용함.
- 2배 정밀도(doble precision) 부동소수점 수 ☞ 배정도 실수
- 64비트를 사용함.
- 기본 정밀도(single precision) 부동소수점 수 ☞ 단정도 실수
자바스크립트의 숫자 타입
- 다른 프로그래밍 언어들과 달리 자바스크립트에선 정수(integer)와 실수(real number) 구분 없이 하나의 숫자 타입만 가짐. ECMAScript 사양에 따르면, 숫자 타입의 값은 2배 정밀도 부동소수점 형식을 따름.
- 즉 자바스크립트에선 모든 숫자가 실수로 처리되며, 정수만을 표현하기 위한 데이터 타입은 별도로 존재하지 않음.
- 이진 표기법으로 십진수를 표현할 때는 무한 개의 수가 필요한 경우가 많음. 즉 64비트 부동소수점 숫자로는 십진수를 제대로 표현할 수 없는 경우가 있음.
- 예를 들어 자바스크립트에서 0.1 + 0.2 === 0.3 은 false임.
- 예를 들어 자바스크립트에서 0.1 + 0.2 === 0.3 은 false임.
- 자바스크립트 Number 객체의 내장 프로퍼티들을 사용하여 이러한 문제를 해결할 수 있음.
Number.EPSILON // ⓐ1 // ⓑ1보다 큰 값 중 가장 작은 값 // ⓐ와 ⓑ 사이의 간격을 반환함. Number.MAX_SAFE_INTEGER // 가장 큰 정수를 반환함. Number.MAX_VALUE // 가능한 가장 큰 부동소수점 수를 반환함. Number.MIN_SAFE_INTEGER // 가장 작은 정수를 반환함. (음수) Number.MIN_VALUE // 가능한 가장 작은 부동소수점 수를 반환함. (음수가 아님) // 대소 비교 -Infinity < Number.MIN_SAFE_INTEGER < 0 < Number.MIN_VALUE < Number.MAX_SAFE_INTEGER < Number.MAX_VALUE < Infinity
- 예를 들어 아래와 같이 Number.EPSILON을 응용한 함수를 만들 수 있음.
function numberEquals(x, y) { return Math.abs(x - y) < Number.EPSILON; } numberEquals(0.1 + 0.2, 0.3) // true
- 예를 들어 아래와 같이 Number.EPSILON을 응용한 함수를 만들 수 있음.
<참고>
'dev-log > CS' 카테고리의 다른 글
컴퓨터 내부의 언어 체계(1) - 비트로 "논리"와 "정수" 표현하기 (0) | 2021.07.04 |
---|---|
[네트워크] 가상 호스트(Virtual Host) (0) | 2021.06.01 |
[운영체제] 가상 메모리(Virtual Memory System) (1) | 2021.05.20 |