반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • FastAPI (0)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 추상 팩터리 패턴
  • 알고리즘
  • 메이븐 라이프사이클
  • 자바 검증
  • 플라이웨이트패턴
  • 스프링 검증
  • 자바스크립트
  • 서버리스 컴퓨팅
  • 외래키 제약조건
  • 이펙티브자바
  • 자바스크립트 면접
  • 자바스크립트 인터뷰
  • 메이븐 페이즈
  • Javadoc 자바독 자바주석 주석 Comment
  • bean Validation
  • 싱글턴
  • 자료구조
  • 느린 쿼리
  • 프로그래머의 뇌
  • 자바 디자인패턴
  • 이펙티브 자바 item9
  • 메이븐 골
  • 팩터리 메서드 패턴
  • try-with-resources
  • 러스트
  • item7
  • 자바
  • prerendering
  • 토비의 스프링
  • rust
  • pnpm
  • MSSQL
  • item9
  • serverless computing
  • Pre-rendering
  • 싱글톤
  • NEXT JS
  • 싱글톤 패턴
  • 참조 해제
  • 객체복사
  • 이펙티브 자바
  • 작업기억공간
  • 빈 검증
  • Next.js
  • 도커공식문서
  • 디자인패턴
  • Java
  • next js app
  • item8
  • 슬로우 쿼리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

용어 (개발용어)

IEEE 754 부동소수점이란?

2023. 3. 17. 01:17

IEEE 754

  • 부동소수점을 표현하는 표준이다.
    • 부동소수점은 가수부(유효 숫자)와 지수부(소수점의 위치)를 나눠 소수를 표현하는 것이다.
  • IEEE 는 전기전자공학자협회 (Institute of Electrical and Electronics Engineers, IEEE) 를 말한다.

IEEE 754가 정의하는 것들

위키피디아 에 나와있으나 이것들을 몰라도 개발자가 적당히 IEEE 754 를 이해하는데는 큰 문제가 없다.

  • 산술 형식
  • 압축 인코딩 방식
  • 반올림 규칙
  • 작동 방식
  • 예외처리

구조

총 3가지 부분으로 나뉜다.

  • 부호 비트
    • 1 비트
  • 지수부 (Exponent bits, e 비트)
    • 8 비트
  • 가수부 (Fraction bits 혹은 Mantissa, f 비트)
    • 23 비트

예제1: -118.625 표현해보기

  • 총 32비트이다. 그니까 32비트를 먼저 0으로 작성해보자.
    • 0000 0000 0000 0000 0000 0000 0000 0000
  • 32비트를 부호 비트, 지수부, 가수부 로 나누자.
    • 0 (1, 부호) 0000 0000 (8, 지수) 000 0000 0000 0000 0000 0000 (23, 가수)
  • 음수의 부호 비트는 1이다.
    • 1 (1, 부호) 0000 0000 (8, 지수) 000 0000 0000 0000 0000 0000 (23, 가수)
  • 부호 비트를 표기했으니, - 부호를 제외한 118.625 를 2진법으로 바꾸어야 한다.
    • 0111 0110 (118) . 101 (0.625)
  • 맨 왼쪽에 1 하나만 존재하도록 우측으로 시프트 연산을 해주어야 한다.
    • 6번 오른쪽으로 시프트 연산을 하면 1하나만 남게 된다.
    • 01 . 110110101 -> 1 . 110110101 * 2^6
    • 1 . 110110101 * 2^6 을 정규화된 부동소수점 수 라고 한다.
  • 정규화된 부동소수점 수를 기준으로 지수부와 가수부를 만든다.
  • 지수부 만들기
    • 지수부는 이전에 정규화된 부동소수점 수 를 만들기 위해 시프트 연산을 한 횟수를 기준으로 한다.
    • 총 6 번 시프트 연산을 하였으므로, 6 을 넣을 것이다.
    • 그런데 그냥 6 을 넣는 것이 아니라 bias 값 127 을 추가해야 한다.
      • 값 비교 혹은 무한대, NaN 과 같은 특수한 값을 편하게 다루기 위해서 bias 가 사용된다.
      • 6 + 127 즉, 133 을 지수부에 넣으면 된다.
      • 비트로 쉽게 생각하고 싶다면 128 + 5 로 생각하면 쉽다.
    • 1000 0101 가 지수부가 된다.
  • 가수부 만들기
    • 가수부는 정규화된 부동소수점 수 의 소수점 이하 숫자 뒤에 0 을 덧붙여서 총 23 비트로 만들면 된다.
    • 000 0000 0000 0000 0000 0000 이렇게 먼저 23자리 수를 만들어놓고 덧씌우면 쉽다.
    • 110 1101 0100 0000 0000 0000 이게 가수부가 된다.

-118.625 를 IEEE 754 로 표현하면, 1 (1, 부호) 1000 0101 (8, 지수) 110 1101 0100 0000 0000 0000 (23, 가수) 이다.

10진수를 IEEE 754 로 표현하는 방법 정리

  • 2진수 표현으로 변환한다.
  • 정규화된 부동소수점 수 를 구한다.
  • bias 와 시프트 연산 횟수 를 통해 지수 비트 를 구한다.
  • 정규화된 부동소수점 수 의 소수점 이하 수에 패딩을 붙여 가수 비트 를 구한다.
  • 부호 비트 를 구한다 (0: 양수, 1: 음수)
  • 합친다.

IEEE 754 의 종류

  • 위에서 IEEE 754 를 배워봤다.
  • 여태까지 배운 IEEE 754 는 사실 단일 정밀도라고 불리는 32bit 버전의 IEEE 754 이다.
  • IEEE 754 는 필요에 의해 보통 2가지 정밀도로 나뉜다.
    • 단일 정밀도, 단정도, 단정밀도, Single Precision 으로 불리는 32비트 표현방식
    • 배 정밀도, 배정도, 배정밀도, Double Precision 으로 불리는 64비트 표현방식
  • C언어에서는 float 이 단정밀도와 대응되고 double 이 배정밀도와 대응된다.

정밀도가 나뉘는 이유

  • 간단하게 우리가 원주율(PI)을 이용해 계산을 할 때, 보통 3.141592 라는 값으로 치환하여 계산한다.
  • 그 뒤에 분명 더 붙는 숫자가 있지만, 일반적인 분야에서는 그만큼의 정밀도가 필요하지 않다.
  • IEEE 754 의 단정밀도, 배정밀도도 마찬가지이다.

단일 정밀도 IEEE 754

  • 32비트로 부동소수점을 표현한다.
  • ex. -118.625 -> 1 (1, 부호) 1000 0101 (8, 지수) 110 1101 0100 0000 0000 0000 (23, 가수)

배 정밀도 IEEE 754

  • 64비트로 부동소수점을 표현한다.
  • ex. -118.625 -> 1 (1, 부호) 100 0000 0101 (11, 지수) 1101 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (52, 가수)

예제2: -118.625 표현해보기 (double precision)

상세한 과정은 예제1 에서 다뤘으니, 예제2 는 간단하게 구해볼 것이다.

  • -118.625 의 2진수 표현은 1110110.101 이다.
    • 118 은 2진수로 표현하면 1110110 이다.
    • 0.625 는 2진수로 표현하면 101 이다.
  • 이제 정규화된 부동소수점 수를 구해야 한다.
    • 이전과 동일하게 소수점 왼쪽에는 숫자 1 만 위치하도록 시프트 연산을 해야 한다.
    • 오른쪽으로 6번 시프트 연산을 하면 1.110110101 가 나온다.
    • 6 (시프트 연산 수) + 1023 (bias) 를 하면, 0100 0000 0101 이 나온다.
  • 마이너스이기 때문에 부호 비트는 1 이다.
  • 지금까지 구한 부호 비트와 지수 비트를 합치면 아래와 같은 결과가 나온다.
    • 1 0100 0000 0101
    • 여기에 정규화된 부동소수점 수의 소수점 이하 자리를 더해주면 다음과 같다.
    • 1 0100 0000 0101 1101 1010 1
    • 이제 오른쪽에 0으로 패딩을 붙이면 끝난다.
    • 1 0100 0000 0101 1101 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  • 결과: 1 (1, 부호) 100 0000 0101 (11, 지수) 1101 1010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (52, 가수)

기타 팁: 자바스크립트에서 0.1 과 0.2 를 더했을 때 결과가 이상한 이유

  • 0.1 을 2진수로 바꾸면 0.000 1100 1100 1100 1100 ...
  • 0.2 를 2진수로 바꾸면 0.00 1100 1100 1100 1100 ...

위와 같이 나온다. 2진수가 무한 소수 (혹은 순환 소수) 로 표현되는 것이다.

둘을 더하면

  • 0.000 1100 1100 1100 1100 ...
  • 0.001 1001 1001 1001 1001 ...
  • ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
  • 0.010 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110
  • 0.01001100110011001100110011001100110011001100110011001100110011001100110 가 결과로 나오고
  • 이 이진수를 10진수로 바꿔보면 0.30000000000000004440892098500626161694526672363281 이 나온다.

결과적으로 2진수로 바꿨을 때 순환소수로 표현되어 어쩔 수 없이 정확한 10진수로 변환할 수 없어서 그렇다.

반응형
저작자표시 비영리 (새창열림)

'용어 (개발용어)' 카테고리의 다른 글

빅 엔디언 (big endian) 과 리틀 엔디언 (little endian) 이란?  (0) 2023.03.18
2의 보수란?  (0) 2023.03.18
클램프 (Clamp) 란? feat. 컴퓨터 과학, 그래픽스 용어  (0) 2023.03.15
UTF (Unicode Transformation Format) 인코딩이란?  (0) 2023.03.10
이스케이프 시퀀스 (Escape Sequence) 란?  (0) 2023.03.10
    '용어 (개발용어)' 카테고리의 다른 글
    • 빅 엔디언 (big endian) 과 리틀 엔디언 (little endian) 이란?
    • 2의 보수란?
    • 클램프 (Clamp) 란? feat. 컴퓨터 과학, 그래픽스 용어
    • UTF (Unicode Transformation Format) 인코딩이란?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바