Tuuna Computer Science

부동소수점 캐스팅(convert int pointer to float pointer 본문

computer architecture

부동소수점 캐스팅(convert int pointer to float pointer

GuTTe 2018. 9. 29. 01:24

삽질하면서 풀던 부동소수점 관련 문제가 있었다. 결국 풀어서 희열느끼면서 풀이 쓰는중


일단 부동소수점에 대한 개념부터 알아보자.

먼저 간단한 예시로 정수 1은 실수 1이다. 하지만 정수 1.2를 실수로 어떻게 표현할 까?

그래도 1.2다. 여기서 문제가 발생한다. 이 실수 1.2를 컴퓨터가 사용할 수 있는 이진수로 나타낼 수 있는가 이다. 이를 나타나게 해주는게 부동소수점이다.

이 부동소수점은 IEEE floating point표준안을 따르는데 이 표준안이 어떻게 되어 있냐면


이렇게 나타낸다.

처음 s부분 1비트를 부호비트라 한다, 즉 음수면 1 양수면 0

편향지수는 말그래로 32bit기준 바이어스인 127에 지수값을 더한것이다. 좀 이따 자세히 설명할 부분이다. 그리고 실질적인 값을 나타내는 가수부분이 존재한다.

이 부호부분과 편향지수, 가수부분을 어떻게 나타내냐.

일단 0.5625라는 소수가 있다고 보자 이 소수를 이진소수로 나타내어 보자.

이진소수로 나타내기 위해서는 x2를 해서 소수부분이 0이될 때 까지 곱한다. 그리고 곱해서

정수부분에 1이되면 비트 1을 추가시키는 방식으로 진행된다.

무슨말이냐면

0.5625에 x2를 하면 1.125이다. 정수부분에 1이 만들어졌으니 1을 때고 0으로 만든다.

0.125가 되겠지. 여기서 x2를 하면 0.25가 된다. 이때 정수부분이 0이니 비트를 때준다.

그럼 0.25에서 다시 x2를 하면 0.5가 된다. 정수부분이 0이네 0을 비트에 추가시켜 준다.

그리고 다시 x2를 해서 1.0으로 만들면 정수부분은 1이 되고 비트에 추가시켜준다.

그리고 소수부분이 0이 되어 이제 연산이 끝난다.

지금까지 연산했던 것을 종합해보면

1001이 된다.
0.5625 x2  => 1.125 => 1
0.125 x2 => 0.25 => 0
0.25 x2 => 0.5 => 0
0.5 x 2 => 1.0 => 1

즉 0.1001이 0.5625의 이진소수이다.  다시 되돌리려면 첫째자리부터 0.5 0.25 0.125를 각각 곱해주면 된다.

그리고 여기서 정수부분의 이진수는 여러분이 잘 알다시피 그냥 바꿔주면 된다.

즉 3.5625를 이진소수로 나타내면 11.1001이 된다. 여기서 이진소수는 항상 ' . '이 1이 되는 것을 기본으로 하니 1이 되게 해준다 (정규화)

1.11001 x 2^1 여기서 2의 1승이 되었지 않는다. 이 1이 지수이다. 근데 32bit기준으로 바이어스는 127이니 이 127에 지수 1을 더한게 편향지수이다.

그리고 1.11001에서 '.'앞에 1은 때고 숨겨둔다. 그럼 0.11001이 나오는데 이 부분이 가수부분이다.

그럼 모든 정보를 알았으니 이제 부동소수점 형식으로 나타내어 보자.

0(부호비트) 1000 0000(편향지수) 11001000000000000000000(가수) 이런식으로 나온다.
가수부분의 나머지비트는 0으로 채운당

그럼 이 거를 4비트씩 끊어서 읽어보겠다.

0100 0000 0110 0100 0000 0000 0000 0000 => 0x40640000 16진수로 이 값이 나온다.

근데 여기서 C언어는 값을 좀 더 보정하기 위해서 아까 숨겨둔 비트 1을 더해서

0x40640001로 만든다.

암튼 3.5625는 부동소수점 형식으로 0x40640001로 표현된다.

이제 이거를 코드상으로 나타내 보겠다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void)
{
    int a = 0x3e200000//16진수 값을 넣었다. 부동소수점 형식에 맞춰서
    int* ptr = &a; //a의 주소를 준다.
    float* ptr2 = (float*)ptr; //ptr을 float pointer형으로 넘겨준다.
    printf("%f"*ptr2); //ptr2은 0x3e200000을 부동소수점 형식의 비트로 나열한 뒤 읽어와서 출력
    
    return 0;
}
cs

OutPut : 0.156250

반대로 INPUT을 0.156250으로 하면 0x3e200000이 나오겠지

왜냐면 0.156250을 부동소수점 형식으로 나타내고 이를 4비트를 씩 끊어 읽으면 0x3e200000이 나오니깐 ㅎㅎ

첨에 풀땐 이해가 안됬늗네 직접 변환해서 푸니깐 되넹 ㅎㅎ 나중에 우려먹어야 겠다.








'computer architecture' 카테고리의 다른 글

컴퓨터 구조 ( Memory에 대해서 )  (0) 2018.10.27
컴퓨터 구조( CPU에 대해서 )  (0) 2018.10.27
Comments