컴퓨터는 데이터를 0 과 1인 전기적 신호의 비트로써 구성함
정수는 최상위 비트(MSB, most significant bit)에 부호를 의미하는 Sign 값을, 나머지에는 2진수를 통해 정수들을 표현하지만
소수를 어떻게 표현해야 하는가에 대한 문제가 발생함
이에 컴퓨터 과학자들은 비트를 역산하여
1/2, 1/4, 1/8... 등의 합으로 소수를 표현하는 방식을 고려하게 됨
ex)
12.375 = 1×10¹ + 2×10⁰ + 3×10⁻¹ + 7×10⁻² + 5×10⁻³
소수의 표현 방식에는 고정소수점 방식과 부동소수점 방식이 있음
고정소수점
고정소수점 방식은 정수부의 크기와 소수부의 크기를 지정된 크기로 나누어 표현하는 방식
해당 방식의 장점은 크기가 고정되어 있기 때문에 연산이 단순하고 구현이 쉽다.
단점은 정수부의 표현이 많이 필요가 없을 경우 소수부에 대한 정밀도가 떨어지고,
특정 범위를 임의로 제한해야 했기에 확장성에 불리하다.
그래픽스에서
fixed가 고정소수점 방식
소수부에 대한 크기를 정수부의 크기에 따라서 자유롭게 조절 가능하도록 하는 방식이 필요하였고
이에 대한 것이 부동소수점 방식(floating point) 이다.
부동소수점
현대의 컴퓨터 과학에서 부동소수점 방식은 일반적으로 IEEE-754를 따른다.
(IEEE, I nstitute of Electrical and Electronics Engineers)
https://standards.ieee.org/ieee/754/993/
(1985, 2008, 2019)
IEEE-754 부동소수점의 경우
소수부를 구성하는데 있어서
부호(sign), 지수(exponent), 가수(mantissa) 부로 나뉘게 된다,
부호는 양수, 음수에 대한 부분
지수는 부동소수점의 비트 시프트를 위한 처리 부분 2^(E-bias)
가수는 이진수로 정규화 했을때의 1.xxx의 xxx 부분
ex)
10진수 표기법의 6.5를 이진수로 바꿀 때
6.5(10) = 110.1(2) = 1.101 * 2^2
-> 앞에 1은 항상 정규화시 1.xxx의 표기로 되므로 1 부분에 대한 것은 버린다.
부동수수점의 비트 크기에 따라서
각각
half, 반정도, 16비트, 2바이트 1+ 5 + 10
float, 단정도, 32비트, 4바이트 1 + 8 + 23
double, 배정도, 64비트, 8바이트 1+ 10 + 53
유효숫자
- 오차를 포함하더라도 신뢰할 수 있을 정도의 수치
컴퓨터에서는 메모리 + 계산 결과의 시간제약 등등으로
값을 완벽하게 도출하거나 도출해 내려 하는것은 의미가 크게 없다.
컴퓨터의 성능을 측정할때 부동소수계산의 효능을 측정하는 것이 아니라면
알고리즘이나 전산처리, 데이터 처리 등에는 사용하는 데이터에 대해
유효 숫자 이내의 범위만 만족한다면 그걸로도 충분하다.
각 타입의 유효숫자는 정수부가 0인, exponent가 최대 크기일때의 mantisa값을 10진수로 변환했을때가
해당 타입이 부동소수의 크기를 최대로 수용 가능한 유효 숫자이다.
당연하게도 정수부의 유무에 따라서 소수부의 크기가 달라지므로 계산이 이 또한 고려 해 보아야 함
log2 의 값은 약 0.3 정도이므로 각각 hidden bit를 통한 정밀도 고려시
고정소수점
fixed, 8~11bit, -> 약 3자리까지의 유효숫자, 정수부는 따로 고려하지 않음
부동소수점
half, 0.3 * 11 = 3.3 -> 약 3자리까지의 유효숫자
float, 0.3 * 24 = 7.2 -> 약 7자리까지의 유효숫자
double, 0.3 * 54 = 16.2 -> 약 16자리까지의 유효숫자
로 볼 수 있다.
fixed4, half4를 Albedo로 사용할 수 있는 이유는
한 픽셀에서 각 rgba에서는 8비트의 1~255의 값을부동소수 값으로 매핑하는데
1/255 = 0.003이므로 유효숫자 범위 안에 들어간다.
반면 normal map의 텍스쳐를 받아오는 경우
0.003의 3자리 유효숫자로는 각도의 차이에 따른 연속적인 결과를 처리하기 어렵고
정규화시 오차 범위가 크기 때문에 이보다 한층 더 큰 정확도를 가진 float로 처리한다.
c++에서 정밀도와 관련하여 어디까지 출력하는가를 고려할때
cout.precision을 사용함
cout<< cout.precision(n)<< a;
cout.precision는 유효숫자 수, 소수점 자리수가 아님
ex)
precision(4일때)
123.456789 -> 123.5
반면
cout<< fixed<< cout.precision(n)
의 경우
소숫점 아래 몇째 자리까지 출력하겠다는 의미
'Problem Solving' 카테고리의 다른 글
| BOJ 1012 — 유기농 배추 (0) | 2026.02.09 |
|---|---|
| BOJ1003 - 피보나치 함수 (0) | 2026.02.04 |
| BOJ 1018 – 체스판 다시 칠하기 (0) | 2026.02.03 |
| BOJ 1181,10814 - sort, stable_sort (1) | 2026.01.22 |
| BOJ 10250 ACM 호텔 - 문제 잘 읽기, 코드 작성 전 설계 잘 하기 (0) | 2026.01.12 |