예전에 처음 글 올릴때 공부했었던건데 이것저것 정리하다 텍스트 파일을 발견해서 심심해서 올려봄.

http://gall.dcinside.com/board/view/?id=programming&no=720628&page=1


10진수: 2.5
2진수: 10.1

이때 2진수 소수점 아래를 계산 하는 방법은 다음과 같다.

소수점 아랫수에 2를 곱해서 1이상이 나오면 1을, 아니면 0을 씀.

(사실 자릿수가 내려갈때마다 2씩 나누어지는 거니 조금만 생각해보면 충분히 알수있다.)


----부동소수점화
부동소수점?? (https://ko.wikipedia.org/wiki/부동소수점)
float
부호(1) 지수(8) 가수(23) => 4바이트
double
부호(1) 지수(11) 가수(52) => 8바이트

부동소수점 표현식
(-1)^m S*(B^e)
m: 양수면 0, 음수: 1, mark
S: 가수, Significand
B: 기수, Base
e: 지수, exponent

변형
=>
float
+- 1.S*(2^(e-127))
double
+- 1.S*(2^e-(1023))

여기서는 이진법이므로 기수=2
=>
+- S*(2^e)

지수부도 +-가 필요. 이때 사용하는 표현이 excess 표현. 지수부에서 나타낼 수 있는 최대 값을 반으로 나누어 그 값을 0 으로 보고 그것(0)보다 큰 값을 양수처럼, 작은값을 음수로 계산한다. (즉 최대값을 반으로 나눈 값을 기준으로 본다.)
float: 8자리이므로 255/2 = 127.5 => 127이 0임.
double: 11자리이므로 2047/2 = 1023.5 => 1023이 0임.
=>
float
+- S*(2^-127)
double
+- S*(2^-1023)

부동소수 표현은 소수점 이상을 1로 고정한다라는 정규 표현을 사용.
즉 반드시 정수부의 첫번째 자리는 1로 만들고 그 이상의 자리는 0으로 해주는 표현방법.
=>
float
+- 1.S*(2^(e-127))
double
+- 1.S*(2^(e-1023))

ex) 2.5의 경우 지수부 표현 방법
10.1 원래 숫자
001.01 정수부의 첫번째 자리는 1로 만들도록 쉬프트 연산자 적용. 2^1
float
127+1=128 =>
10000000
double
1023+1=1024
10000000000

ex) 2.5의 경우 가수부 표현 방법
10.1 원래 숫자
001.01 정수부의 첫번째 자리는 1로 만들도록 쉬프트 연산자 적용. 2^1
001.01000000000000000000000 float의 경우 23비트까지 0생성
01000000000000000000000 가 float의 정규 표현방법
0100000000000000000000000000000000000000000000000000 가 double의 정규 표현 방법

즉,
float
0(부호) 10000000(지수) 01000000000000000000000(가수)
=>2진수 표현값
01000000001000000000000000000000
1075838976(10)
40200000(16)

double
0(부호) 10000000000(지수) 0100000000000000000000000000000000000000000000000000(가수)
=>2진수 표현값
0100000000000100000000000000000000000000000000000000000000000000(2)
4612811918334230528(10)
4004000000000000(16)

----비교
비교(16진수, HEX)
결과값
4004 0000
float
4020 0000
double
4004 0000 0000 0000


----복원
float
0 10000000 01000000000000000000000
부호는 +
지수 128(127+1) => 2의 1제곱. =>2
가수 1.01 => 1.25
+ 1.25*(2^1) = 2.5


double
0 10000000000 0100000000000000000000000000000000000000000000000000
부호는 +
지수 1024(1023+1) => 2의 1제곱. =>2
가수 1.01 => 1.25
+ 1.25*(2^1) = 2.5