ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1072)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (348)
      • C++ (167)
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • c#
  • 포인터
  • 파이썬
  • Unity
  • 그래픽스
  • 알고리즘
  • C
  • 프로그래머스
  • 언리얼
  • SQL
  • 클래스
  • 배열
  • 문자열
  • 백준
  • C++
  • 티스토리챌린지
  • 함수
  • string
  • 오블완
  • 유니티

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

CS/자료구조 & 알고리즘

float 자료형의 메모리 구조 (컴퓨터의 실수 표현)

2025. 3. 23. 14:36

실수형은 IEEE의 부동소수점 형식을 사용하는데 4바이트(32비트) 표현의 경우 아래와 같이 이루어져 있다.

 

정수의 경우 2의 보수법을 이용해서 간단하게 메모리에 저장된 비트를 확인할 수 있지만 실수는 조금 더 복잡하다.

아래의 단계를 거치면 실수가 메모리에 어떻게 표현이 되는지 알 수 있다. 위에 나와있는 -101.625를 컴퓨터의 표현 방법으로 바꿔보겠다

1단계 - 이진수로 바꾸기

이진수로 바꾸기 위해서는 나눗셈과 곱셈을 하면 된다. 일단 부호를 제외하고, 정수 부분은 2로 나누기를 연속으로 해서 2진수로 바꿔주자

 

101/2 = 50 ... 1

50/2 = 25 ... 0

25/2 = 12 ... 1

12/2 = 6 ... 0

6/2 = 3 ... 0

3/2 = 1 ... 1

 

정수 부분은 1100101 이다.

 

소수 부분은 0.625인데, 소수 부분은 2를 곱하기를 연속으로 해서 2진수로 바꿔주면 된다.

0.625 x 2 = 1.25 -> 1

0.25 x 2 = 0.5 -> 0

0.5 x 2 = 1.0 -> 1

 

이렇게 해서 소수 부분은 0.101 이다, 2진수로 표현을 해주면 -1100101.101(2)

이진수를 지표x가수 형태로 바꿔준다

 

소숫점을 앞쪽으로 옮겨서 맨 앞자리에 1만 남기도록 하는거다, 이렇게 하면 가수는 1100101101이 되고, 지수는 6이 된다

일단 부호와 기수를 먼저 채워넣자, 기수 부분에서 소수점 위에 있는 1은 제외하고 넣어준다 부호는 음수니까 1, 가수는 위에 구한 것을 앞에서 부터 넣고, 남아있는 비트는 0으로 채워준다.

지수에 바이어스를 더해준다 (2의 보수법을 하면 힘들다)

32비트(4바이트)의 경우 127, 64비트의 경우 1023를 더해준다

 

이렇게 되니까 두 수를 더해준다

 

이렇게 바이어스로 더해준 지수까지 넣어주면 완성이다

예제

#include <stdio.h>
#pragma warning(disable:4996)
#define MASK 1

int main(void)
{
	float num;
	unsigned int* pNum;
	
	printf("실수를 입력하세요:");
	scanf("%f", &num);
	
	pNum = (unsigned int*)&num;
	printf("\n16진수 표기 : 0x%X\n\n", *pNum);

	printf("부호\t지수\t가수\n");

	printf("%d\t", *pNum >> 31 & MASK);

	for (int i = 30; i >= 23; i--)
	{
		printf("%d", *pNum >> i & MASK);
	}
	printf("\t");

	for (int i = 22; i >= 0; i--)
	{
		if ((i + 1) % 4 == 0) printf(" ");
		printf("%d", *pNum >> i & MASK);
	}
	printf("\n");

	return 0;
}

 

https://m.blog.naver.com/liveforu/222104163895

저작자표시 (새창열림)

'CS > 자료구조 & 알고리즘' 카테고리의 다른 글

외판원 순회 (TSP) 알고리즘 개념  (0) 2025.04.02
실수형 (float) 자료형의 메모리 구조, 실제로 변환해보기  (0) 2025.03.23
[C++] 조합 (Combination) 구할 수 있는 알고리즘  (0) 2025.03.12
[C++] multimap 값 가져오기  (0) 2025.03.03
논 블로킹 알고리즘 (Non-blocking Algorithms)  (1) 2025.02.16
    'CS/자료구조 & 알고리즘' 카테고리의 다른 글
    • 외판원 순회 (TSP) 알고리즘 개념
    • 실수형 (float) 자료형의 메모리 구조, 실제로 변환해보기
    • [C++] 조합 (Combination) 구할 수 있는 알고리즘
    • [C++] multimap 값 가져오기
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바