고정소수점

  예 123.456의 경우 정수 부분 123, 소수 부분 456 나누어서 표현해야만 한다.

부동 소수점

  123456이라는 유효숫자와 3이라는 소수점 위치를 통해서 넓은 범위의 수를 표현할 수 있는 장점이 있다.

 

소수를 2진수로 변환하는 절차는 2를 곱한뒤 1보다 크면 1을 빼고 1을 입력하고 1보다 작다면 0을 입력한 뒤 나머지를 똑같이 한다.( 0이 나올 때까지 한다. )

 

예) -9.6875를 2진법으로 표현하면 -1001.1011(2)가 된다.

이 숫자를 저장하기 위해서는 정규화 과정을 거치는데 지수를 이용해서 실수를 표현한다.

-1.0011011 * 2의3승

2 정규화란 정수부를 1로 맞추어놓고, 적절하게 소수점 위치를 조정

 

-9.6875 -> -1001.1011(2) -> -1.0011011 * 2의 3승 -> [부호부 음수, 지수부 3, 가수부 0011011] (일반적인 IEEE 754 표준)

 

float 부호부:1Bit 지수부:8Bit 가수부:23Bit 총 32BIt

double 부호부:1Bit 지수부:11Bit 가수부:52Bit 총 63비트

비트수가 double이 두배 많으므로 정밀도가 좋으며 표현 범위도 훨씬 넓다 가능하다면 double을 사용해야 한다.

 

float을 기준으로 / 부호부 양수면 0, 음수면 1 / 지수부 -127(0000 0000) ~ 128(1111 1111)까지 표현 가능 (256단계)  (바이어스 표현법(순수한 0을 표시하기 위해)) / 가수부 변환된 가수부를 왼쪽부터 그대로 채우면 됨

 

지수부가 모든 비트가 0으로 채워져 있을 때 2의 0승이니 1로 표현되어야 하는데 IEEE 754에서는 지수부가 모두 0으로 채워진 경우에는 유효숫자의 정수부가 1이 아니라 0이 되도록 그에 맞춰서 지수는 -127이 아니라 -126으로 고정한다.

지수부가 모두 0인 경우 -127이 아닌 -126을 나타낸다. 따라서 지수부가 실제로 표현할 수 있는 지수의 범위는 -126 ~128이 된다.

 

지수부가 모두 0, 가수부의 마지막 비트가 1일 경우 0.00000000000000000000001 * 2의 -126승 = 2의 -149승까지 표현이 가능하다.

 

표현 한계

(0이 22개)

1.0000000000000000000000 * 2의 23승 = 8388608

오른쪽으로 23자리 이동하게 되면 소수점 이하 부분이 남아있지 않게 됨 -> 소수점 이하 표현 X

float은 8388608 이상을 나타낼 때 소수점 이하 표현 X

정수가 커질수록 오차가 커짐

float에서 지수가 25일 경우 가수부가 23비트이므로 소수점을 오른쪽으로 2번 이동하게 돼서 2의 25승 33554432 이상의 수를 float으로 표현할 경우 오직 4의 배수만을 나타낼 수 있다. 33554432 다음으로 나타낼 수 있는 수는 33554436이 된다.

 

부동소수점 사용 시 주의점

64비트 정수 타입인 __int64 사용해야 한다.

반올림에서도 문제가 발생할 수도 있다. 0.4255를 실제로 부동소수점으로 표현될 경우 0.42549999-- 이기 때문에 3번째 자리에서 반올림을 하면 0.426이 아니라 0.425가 나온다.

 

무한 & NaN(Not & Number 미정의 결과 | 값이 없는 상태)

 

지수부의 모든 비트가 1로 채워져 있는 경우

float의 지수부는 8비트, 표현 가능한 지수의 범위는 -126 ~ 128

모든 비트가 1로 채워진 상태인 128이 무한과 NaN에 대하여 예약되어 있으므로 실제 지수의 범위는 -126 ~ 127

무한과 NaN은 가수부에 의해서 나누어진다.

가수부의 모든 미트가 0 - 무한

가수부 부분 중 하나라도 1이 있을 경우 - NaN

무한의 경우 양의 무한과 음의 무한 나누어짐 (부호 비트)

NaN을 표한할 수 있는 방법은 모든 비트를 모두 1로 채우는 것

'C++ > Fundamental' 카테고리의 다른 글

참조 타입  (0) 2022.02.07
날짜 시간  (0) 2022.02.02
문자열  (0) 2022.01.28
문자 타입  (0) 2022.01.23
보수  (0) 2022.01.11

+ Recent posts