부동소수점이란?

da.circle·2023년 1월 14일
0

출처) YouTube - 부동소수점(+ 실수계산 오차가 생기는 이유) - 얄팍한 코딩사전

컴퓨터는 2진법으로 모든 데이터를 나타낸다.

10진수의 경우

  • 1/3을 소수로 나타내면 0.3333333333333333333333333333333333… 무한소수가 된다.
  • 10진법로도 정확히 나타낼 수 없는 수가 있다.. 그렇다면 다른 진법으로는 어떨까?

2진법의 경우

  • 9.625를 2진법으로 나타내면 다음과 같다.
    9 = 2³ + + + 2⁰ ⇒ 1001
    0.625 =1/2¹ + 1/2² + 1/2³ ⇒ 101
    9.625 = 1001.101

  • 1/10을 2진법으로 나타내면 다음과 같다.
    1/10은 0.1이므로 소수부분만 나타내면 된다.
    1/2¹ + 1/2² + 1/2³ + 1/2⁴ + 1/2⁵ + 1/2⁶ + 1/2⁷ + 1/2⁸ + 1/2⁹ + 1/2¹⁰ + 1/2¹¹ + 1/2¹² + 1/2¹³ …
    0.0001100110011…
    → 0.0999755859375…
    ⇒ 0.1이 아니다!

컴퓨터가 정수를 효율적으로 나타내는 방법

  • 프로그래밍 언어에서 널리 사용되는 주요 숫자형

    • int (자바, 파이썬) : 소수점이 없는 정수 데이터를 저장하기 위한 자료형이다. 4byte를 사용한다.

      • 음수 : 2³¹ ~ -1

      • 양수 : 0 ~ 2³¹ -1(0을 양수에 포함시켰기 때문에 숫자 하나가 더많으므로 -1)

    • 위의 int처럼 자바나 파이썬 같은 언어는 byte수를 기준으로 여러 타입을 나눈다.

      • byte타입 : 1byte (-128 ~ 127)
      • short타입 : 2 bytes (-32,768 ~ 32,767)
      • int 타입 : 4 bytes (-2,147,483,648 ~ 2,147,483,647)
      • long 타입 : 8 bytes (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
    • 상황에 따라 적절한 타입을 선택해서 메모리에서 사용되는 비트 수를 절약한다.

부동소수점(Floating point)

  • 자바나 파이썬의 Float 타입, 자바스크립트의 number타입이 해당된다.

고정소수점

  • bit를 반으로 나눠서 절반은 정수, 절반은 소수 부분에 할당한다.
  • 정수 부분이 큰 숫자, 소수 부분이 정밀한 숫자를 나타낼 수 없다.
  • 정수 부분을 늘리면 소수 부분이 줄어들고, 소수 부분을 늘리면 정수 부분이 줄어들게 된다.

부동소수점

  • 모든 숫자를 1.xxxxxx 형식으로 나타낸다.
  • 첫 번째 비트는 양수, 음수를 구분하는데 사용한다.
  • 그 다음 8비트로 소수점이 몇 칸 움직일 지를 나타낸다. (127과의 차이)
  • 나머지 23자리에 소수점이 움직인 결과에서 소수점 뒤로 오는 부분들을 채워넣는다.

⇒ 1bit, 8bit, 23bit에 각각 부호, 지수, 가수를 할당하는 방법이 IEEE 754 표준이다.

이런 식으로 오차가 발생하게 되지만 컴퓨터는 한정된 메모리를 가지고 연산을 해야하므로 최대한 효율적인 활용을 위해 부동소수점 방식을 사용한다.

오차 없는 계산 방법

  • 라이브러리 활용
    • Java : BigDecimal 모듈
    • JavaScript : big.js 등
    • 파이썬 : decimal 모듈
profile
프론트엔드 개발자를 꿈꾸는 사람( •̀ ω •́ )✧

0개의 댓글