[한권으로 읽는 컴퓨터 구조와 프로그래밍]실수를 표현하는 방법

2022. 1. 19. 12:41코딩공부/ComputerScience

실수를 표현하는 방법

고정 소수점 표현법

e.g ) 12.25(10), 101.010(2)

 

미리 소수점의 위치를 정해놓고 써서 소수점의 위치가 고정된 표현법

단점 :

일반적인 문제 해결에 있어서는 실수값이 아주 커질 수가 있기때문에 넓은 범위의 숫자를 다룰 수 있는 컴퓨터가 필요하다. 그런 일반적인 문제 해결을 할 수 있는 컴퓨터가 범용 컴퓨터이고, 고정소수점은 큰 실숫값을 표현하려면 비트개수가 너무 많이 필요하기 때문에 메모리 비용이 비싸져서 범용 컴퓨터에서 쓰기가 어렵다.

 

다른 방법이 필요하다!

 

부동 소수점 표현법

큰 범위의 값을 2진수로 표현하기 위해 과학적 표기법을 2진수에 적용한다

과학적 표기법은 소수점 왼쪽이 한자리뿐인 소수에 밑을 몇번 거듭제곱한 값을 곱하는 방식으로 소수를 표현한다.

e.g ) 1200(10) = 1.2(10) x 10^3, 0.101(2) = 1.01(2) x 2^-1

이런 표기법을 부동소수점 표기법이라고 한다.

 

큰 범위의 값은 표현할 수 있게 되었지만,

2비트 가수와 2비트 지수를 사용하는 4비트 부동소수점 수 표현을 보면(p. 70 표 1-8)

1. 비트 조합중에 낭비되는 부분이 많다. e.g) 0을 표현하는 방식이 네개?!

2. 비트 패턴이 가능한 모든 수를 표현하지는 못한다.

 

IEEE 부동소수점 수 표준 

위의 문제의 개선을 위해

IEEE : 미국 전자전기공학회, 표준 제정 등 다양한 활동을 하는 전문가 조직

부동소수점 수 시스템을 사용할 때 지수에 대한 부호 비트를 지수의 비트 패턴에 감춘다던지, 낭비되는 비트 조합을 최소화하고 반올림을 쉽게하기 위한 트릭을 사용한다던지 하는 기능들이 IEEE 754라는 표준에 정의되어있다.

 

똑같은 비트를 사용하더라도 정밀도를 가능한 높이고 싶어서 나온 트릭

1. 정규화

정규화는 가수와 지수를 조정해서 맨 앞에 0이 없게 만드는 것이다.

e.g ) 0.0 01(2) => 1.0 00(2) x 2^-2

2. 디지털 이큅먼트사에서 고안한 트릭

가수의 맨 왼쪽 비트가 1이라는 사실을 알고 있으므로 이를 생략하는 것. 가수에 1비트 더 사용 가능.

 

방금 한 얘기들이나 IEEE 754의 세부사항을 모두 알필요는 아직 없다.

중요한 것은 두가지 부동소수점 수가 가장 자주 쓰인다는 사실

1. 기본정밀도(float) : 가수에 대한 부호 s(1bit) + 지수(8bit) + 가수(23bit)

2. 2배정밀도(double) : s(1bit) + 지수(11bit) + 가수(52bit)

2배 정밀도가 비트수가 많은만큼 더 큰 범위의 수를 표현할 수 있지만 비트를 기본정밀도보다 두배를 더 사용한다.

 

지수에 대한 부호는??

지수 비트가 모두 0이거 나 1인 경우에 특별한 의미를 갖게하고, 실제 지숫값은 나머지 비트 패턴에 집어넣기로 했다

-> 편향된 지숫값을 사용

 

IEEE 754의 편리한 점은 0으로 나눴을 때 생길 수 있는 양의 무한대나 음의 무한대를 표현하는 비트 패턴 등 여러가지 특별한 비트 패턴을 제공한다는 점이다. Nan을 표현 가능한 특별한 값도 있다.

 

2진 코드화한 10진수 시스템

e.g) 2 2 2(10) => 0010 0010 0010(BCD)

4비트씩 쪼개서 10진숫자를 하나 표현하는 것이다.

 

훨씬 익숙하지만 BCD는 2진수를 효율적으로 활용하지 못한다.

일반적인 2진수에 비해 비트를 더 많이 사용하기 때문.