*참 / 거짓 ( 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 |