프로그래밍/C++

#14. 부동소수점 & boolean

코딩하는상후니 2022. 7. 16. 22:01

 
*참  /  거짓 ( boolean )
 
*bool 은 그냥 1바이트 정수에 불과
*어셈블리에서 bool 이란 것은 없음.
*C++ 은 어셈블리보다 좀 더 높은 언어,  '가독성'
 
*왜 bool 1byte 로 잡았을까 ??
=> 메모리의 최소단위가 1바이트 이기 때문

 


 
*실수 ( 부동소수점 )
'부동 소수점은 항상 근사값' 이라는 것을 알아야함.
특히 수가 커질수록 오차 범위도 매우 커짐
ex) 1/3  = 0.33333333333333333333333333333333333....
 
*실수 2개를 == 으로 비교하는 것은 지양
 
*float  (4byte) /  double (8byte)
 
 
*고정소수점
=> 점 앞/뒤를 기준으로 16/16씩 끊으면 ??
=> 너무 작다.
 
 
*부동소수점
=>  . 을 유동적으로 움직여서 표현하는 방법

 

*bias = 127
 
* bias 를 쓰는 이유
=> 음수를 표현하기 위해서
 
만약 0.000101이라는 이진수가 있다 가정할 때,
이 때, 정수부를 1로 만들어야하는데
오른쪽으로 소수점을 밀어서 1.01 * 2^-4 가 됨.
-4 를 어떻게 저장할 것인가 ??
이 때, 사용하는 것이 bias.
 
 
float 부호 ( 1 )  /  지수( 8 )  /  유효숫자( 23 ) = 32 비트 = 4바이트
=> 단정도 ( Single-Precision )
 
double 부호 ( 1 )  /  지수( 11 )  /  유효숫자( 52 ) = 64 비트 = 8바이트
=> 배정도 ( Double-precision )
 
 
ex) -3.375f  라는 값을 저장
=> 2진수 변환
=> (3)  => 0b11 
=> (0.375)  => 0.5 * 0  +  0.25 * 1 + 0.125 * 1  => 0b0.011
=> 0b11.011
=> (정규화) 0b1.1011 * 21
=> 1(부호) 1(지수) 1011(유효숫자)
단, 지수는 unsigned byte 라고 가정하고 숫자+127 만들어줌
 
(예상결과)  :  0b 1 10000000 1011000'0000'0000'0000'0000'
 

 
*'근사치를 개념한다' 라는 말은 무슨 뜻인가 ??
2-1 = 0.5 = 1/2
2-2 = 0.25 = 1/4
2-3 = 0.125 = 1/8
2-4 = 0.0625 = 1/16
...
=> 분모가 2의 거듭제곱 꼴이 아닐 때, 부동소수점 표현 시 오차 발생
 
또한,
int num1 = 2147483640;
float test1 = num1;
 
=> 마찬가지로 근사값으로 표현 되어지고 있다.
test = 2.14748365e+09 이 되고,
( e = 101 으로 표현됨. )
계산 결과 ,
test =   2147483650
num = 2147483640
10 정도 오차가 나는걸 볼 수 있음.

 
본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.
 

'프로그래밍 > C++' 카테고리의 다른 글

#16. 산술 연산  (0) 2022.07.16
#15. UTF & ASCII  (0) 2022.07.16
#13. 정수  (0) 2022.07.16
#12. 스택 메모리 & 스택 프레임 ( Stack Frame )  (0) 2022.07.15
#11. 함수 기초  (0) 2022.07.15