컴퓨터(Computer Science)/컴퓨터구조(Computer Arichitecture)

Floating point, 부동소수점 [컴퓨터구조]

게임이 더 좋아 2021. 6. 18. 00:28
반응형
728x170

 

이번에는  Floating Point에 대해서 알아보겠다. 

 

실수 표현의 예를 들어보자

 

 

 

** scientific notation 이란 소수점 옆에 한자리만 표현하는 것을 의미한다.

그 한자리는 1~9의 범위를 갖는다.

 

++ 만약 0이면 .. 앞자리로 당길 수 있음에도 안 당긴거니까 잘못표현한 방식

 

A number in scientific notation that has no leading 0s is called a normalized number, which is the usual way to write it. 

( 그니까 쓸 데없는 0이 앞으로 오지 않는 것을 의미한다. )

 

기본 개념을 알고가자 우리는 normalized된 것, scientific notation 된 숫자를 다룰 것이다.

 


 

10진법으로 표현된 숫자야 우리는 익숙하지만

컴퓨터는 아무래도 2진수가 익숙한가보다. 

 

2진수를 scientific notation으로 표현하자면

 

 

**2진수니까 저기있는 소수점은 decimal point가 아닌 binary point라고 부른다.

 

Computer arithmetic that supports such numbers is called floating-point because it represents numbers in which the binary point is not fixed, as it is for integers.

(컴퓨터는 플로팅 포인트라고 부르는 숫자 연산을 지원한다.)

 

**floating point란

binary point 가 고정된 위치를 갖지 않는 숫자를 말한다.

 

 

역시나 이렇게 생겨먹었다. 정말 싫다.

 


 

 우리는 32-bit로 실수형을 표기하고 싶다. 

그렇다면 비트를 써서 표현하게 될텐데 막써도 될까???

 

아니다. 기준이 있다.

 

2가지 표현방식이 있는데

이것이 우리가 쓰고있는 float, double 자료형이다.

4바이트, 8바이트 메모리크기가 그러한 이유가 여기 있다.

 

표준은 이렇게 쓰라고 말한다.

 

글로보면 아쉬우니까 그림으로 보자

 

 

S는 sign  부호를 나타내고

exponent는 지수부, fraction은 소수부라고 생각하면 된다.

 

소수가 비트가 많은 것을 보니

float에서는 조금만 정수부가 커져서 범위를 넘어가도 표현을 못하겠구나?? 라고 생각하면 된다.

 

** 참고로 signficand = 1+ fraction이다.

 

 

이 그림을 보면

내가 그 때 언더플로우는 없다해놓고 왜 여기선 언더플로우가 있느냐라고 물어볼 수 있다.

사실 여긴 조금 다르다.

 

이 언더플로우 이름은 Arithmetic Underflow로 산수 언더플로우로 

지수부가 타입의 한계를 넘어 작아지면 0에 가까워지다가 결국 0이 되는 것을 말한다.

 

 


 

 

그렇다면 MIPS에서는 Floating-Point를 어떻게 표현할까??

 

 

우선 MIPS에는  fraction(소수부) exponent(지수부)가 있다. 그리고 Sign-bit도 있다.

그렇지만 소수를 많이 표현해서 정확도를 올리자니 표현할 수 있는 숫자의 크기가 작아지고

지수를 많이 표현해서 숫자의 크기를 키우자니 규모만 크고 정확도는 떨어지고

**trade-off 관계라서 적당히 해서 정했다.

 

 

float 일 때 지수부 8비트 소수부 23비트 사인 1비트

 

우리는 MIPS가 아니니까 우리의 표현식으로 보자면

 

 

 

그렇다면 E가 아주 커져서 엄청난 큰 숫자를 표현해야할 땐 어떨까?

 

즉, 우리가 표현할 수 있는 숫자 범위보다 큰 숫자를 우리가 집어넣으면 어떻게 될까?

overflow 가 된다. 

 

반대로 우리가 표현할 수 있는 숫자 범위보다 작은 숫자를 우리가 집어넣으면 어떻게 될까?

underflow 가 된다.

 

MIPS가 연산을 제대로 할 수 없어서 값도 제대로 나오지 않는다.

그래서 이를 해결하기 위해서

우리는 double 이라는 숫자 형식을 만들었다.

 

**참고하고 넘어가자 double은 밉스에서 32 * 2 = 64bit를 차지한다.

** 128-bit도 지원하기 시작했다.

 

 

double의 최대 최소는

 

 


 

실제로 얼마나 정확한 자리 수 까지 표현할 수 있을까??

 

 

float은 약 소수점 6자리까지 정확하다고 보고

double은 소수점 16자리까지 정확하다고 본다.

** 왠만하면 거의다 double 쓰는 편이다.

 


 

실제로 계산은 어떻게 할까??

 

-0.75는 아래와 같이 계산한다.

 

 

그렇다면 반대로

비트로 숫자를 만드는 것은??

 

 

 


 

숫자를 더 정확하게 표현하고 싶으면 어쩌지?

 

Accurate Arithmetic

To pack even more bits into the significand, IEEE 754 makes the leading 1-bit of normalized binary numbers implicit. 

( 사인 비트도 fraction에 넣어버려서 계산하자)

 

그래서 우리는 이렇게 쓰기도 한다.

 

 

또한

 

 

 


 

우리가 이번엔 지수가 마이너스일 때를 생각해볼까??

 

sign이 1이면 숫자 자체가 마이너스가 되는 것을 알지만

1보다 작은 수를 표현하려면 지수가 마이너스가 되어야 한다.

 

**우리는 2의 보수방법

[프로그래밍언어(Programming Language)/C || C++] - 2의 보수, 2's complement [C]

 

2's complement 방식으로 마이너스를 표현할 거다.

 

이렇게 표현된다.

 

다른 것을 볼까?

 

이렇게 표현된다.

 

**이런 표현방식을 biased notation이라고도 하는데 여기서는 지수부가 8 bit라서 127을 bias로 가진다.

 

컴퓨터 방식이 아닌 우리방식으로는 이렇게 쓴다.

 

 


 

float들의 연산은 어떻게 될까???

 

덧셈부터 알아보자(뺄셈은 어차피 덧셈을 이용하는 것이라 전에 언급했다)

아래와 같이 한다.

 

예를 들면

 

 

다른 예도 있다.

 

 

 

더하는 하드웨어는 살짝만 보고 넘어가자

 

 

 

 


 

다음은 곱셈이다.

 

어렵지 않다.

 

 

2번째 예

 

++2번에서 1.1102는 (2)가 아래첨자로 가야한다.

 

 

 

곱셈은.. 덧셈을 여러번 하는 것과 같다.

 

 


 

그렇다면 MIPS에선 어떨까??

 

 

많고 많다.

 

 

 

당연히 이렇게 보면 못알아들으니

MIPS에서의 예를 보고 넘어가자

화씨와 섭씨의 변환 문제다.

 

 

 

 

 

 

 

반응형
그리드형