상세 컨텐츠

본문 제목

[CS기초] [C언어] 컴퓨터의 실수 표현

개발기록/CS

by 도리(Dory) 2025. 11. 28. 11:50

본문

우선 C언어에는 float(4bytes)과 double(8bytes)의 실수 자료형이 있다.

 

float 자료형을 예로 들면,

다음 그림처럼 4바이트이므로 32비트만큼의 메모리를 가지게 되고

 

가장 왼쪽 1비트는 부호

그다음 8비트는 지수(몇번 곱할지)

그 나머지 비트들은 소수부를 뜻한다.

(IEEE 754 표준)

 

 

 

 

예를 들어 보자.

 

실수 5.75는 컴퓨터가 어떻게 저장할까?

 

 

1. 10진수 -> 2진수 변환

 

정수 부분

5(10) = 101(2)

 

소수 부분

0.75(10) = 0.11(2)

 

따라서

5.75(10) = 101.11(2)

 

2. 정규화 (Normalization)

 

101.11₂  →  1.0111₂ × 2²

 

 

3. IEEE 754 구성

 

구분 비트수
부호(sign) 1bit
지수(exponent) 8bit
가수(mantissa) 23bit

 

 

4. 각 비트 계산

 

부호 비트

5.75 > 0 이므로 0

 

지수 비트

IEEE754는 바이어스 127 사용

(지수가 음수 -127일 때를 대비하여 127을 일괄적으로 더해준다.)

 

실제 지수 저장 값(실제+127) 비트
-127 0 0000 0000
-1 126 0111 1110
0 127 0111 1111
+1 128 1000 0000
+2 129 1000 0001
+128 255 1111 1111

 

→ 저장값 = 실제 지수 + 127 = 2 + 127 = 129

 

 

129 = 1000 0001₂

 

가수 비트

1.0111 (정규화된 값)

 

앞에 1 언제나 항상 1이므로 저장하지 않고 뒤에만 저장한다.

(남는 공간은 0으로 채운다.)

0111 0000 0000 0000 0000 000

 

 

 최종 메모리 비트(32bit)

0 | 10000001 | 01110000000000000000000

 

 

 

이렇게 실수 하나를 컴퓨터 표현 방식으로 나타내보았다.

 

근데 사실!! 가장 중요한 건

컴퓨터가 실수를 표현할 때, 정확한 값으로 표현할 수 없다는 것이다.

 

 

이것이 무슨 말이냐면...

 

컴퓨터는 실수를 2진 분수로만 표현하는데,

대부분의 10진 소수는 2진 소수만으로 표현이 안된다.

 

0.1 = 1/16(0.125) + 1/32(0.00625) + ....

 

불가능!!!

 

그래서 실제로는 다음처럼 저장 된다.

 

숫자 실제 저장값(근사)
0.1 0.10000000149011612
0.2 0.20000000298023224
0.3 0.30000001192092896

 

 

이걸 꼭 기억하고 프로그램을 짜자-!---!!!

관련글 더보기