밑이 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)를 사용함.
    • 정밀도는 실수를 얼마나 정확하게 저장할 수 있는지에 대한 정도를 나타냄.
  • 다음의 두 가지 부동소수점 수가 자주 사용됨.
    기본 정밀도와 2배 정밀도(배정밀도) 비교
     
    • 기본 정밀도(single precision) 부동소수점 수 ☞ 단정도 실수
      • 32비트를 사용함.
    • 2배 정밀도(doble precision) 부동소수점 수 ☞ 배정도 실수
      • 64비트를 사용함.

자바스크립트의 숫자 타입

  • 다른 프로그래밍 언어들과 달리 자바스크립트에선 정수(integer)와 실수(real number) 구분 없이 하나의 숫자 타입만 가짐. ECMAScript 사양에 따르면, 숫자 타입의 값은 2배 정밀도 부동소수점 형식을 따름.
    • 즉 자바스크립트에선 모든 숫자가 실수로 처리되며, 정수만을 표현하기 위한 데이터 타입은 별도로 존재하지 않음.
  • 이진 표기법으로 십진수를 표현할 때는 무한 개의 수가 필요한 경우가 많음. 즉 64비트 부동소수점 숫자로는 십진수를 제대로 표현할 수 없는 경우가 있음.
    • 예를 들어 자바스크립트에서 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​

 

<참고>

 

YES24

 

www.yes24.com

 

자바스크립트로 하는 자료 구조와 알고리즘 - YES24

『자바스크립트로 하는 자료 구조와 알고리즘』은 자료 구조와 알고리즘의 개념을 이해하고 이를 자바스크립트로 구현하는 방법에 관한 책이다. 자바스크립트 프로그래머라면 제대로 된 애플

www.yes24.com

 

모던 자바스크립트 Deep Dive - YES24

『모던 자바스크립트 Deep Dive』에서는 자바스크립트를 둘러싼 기본 개념을 정확하고 구체적으로 설명하고, 자바스크립트 코드의 동작 원리를 집요하게 파헤친다. 따라서 여러분이 작성한 코드

www.yes24.com

 

복사했습니다!