📘 실수형 자료형 정리 요약
- 정수와 실수의 표현 방식은 다르다.
- 실수는 표현 방식에서 정밀도에 의존한다.
- double(8)은 float(4)보다 더 아래의 소수점까지 정확하게 표현이 가능하다.
- 정수는 정수끼리, 실수는 실수끼리 연산하되
두 표현 방식의 피연산자가 연산될 경우 명시적으로 변환해주자.
float f = 10.241f + (float)20;
- 위의 경우 없어도 형변환이 일어나지만,
제어를 정확하게 하기 위해서 명시적으로 형변환을 시켜주자는 것.
1️⃣ 실수형 자료형
처리 방식이 달라 정수와 실수를 구분함
- 정수 : char(1), short(2), int(4), long(4), long long(8)
- 본래 4 byte 크기의 정수형 자료형은 long이었음.
- int는 본래 가변적으로 사용하도록 설계됐으나, 오랜시간 사용하다보니 자연스레 4 byte로 크기가 굳어짐.
- 실수 : float(4), double(8)
- 0 ~ 1 값으로만 보더라도 무수히 많은 수가 존재함.
- 컴퓨터는 이진법으로 수를 표현하는데 이렇게 많은 수를 표현하기엔 너무 한정적임.
컴퓨터가 실수를 표현하는 방법은?
부동소수점
만약 정수와 실수의 값을 섞어서 수식을 짠다면?
int a = 4 + 4.0;
- 컴퓨터가 정수로 표현할 것인지 실수로 표현할 것인지 정해주어야 함.
- 위의 과정에서 담기는 변수 a는 정수 타입이므로 4.0 실수는 정수로 형변환이 진행됨.
- 의도치 않는 연산이 추가되는 것.
- 또한, 의도치 않은 연산으로 인해서 실수가 날 수 있음.
- 실수 -> 정수 형변환이 일어나면서 소수점 아래 값이 없어질 수도 있는 것.
부동소수점 개념
-
실수에선 특정 수를 근사값으로 표현.
- 이때 double은 더 큰 메모리 용량을 사용하여 더 정확하게 수를 표현할 수 있음.
-
32 bit => 4 byte => float의 경우 소수표현
- 예) 51.1
- 10진법 : 100을 위해선 10이 10개 모여야함.
만약 1을 만들려면 0.1이 10개 모여야 함.
- 2진법 : 101010.1(2)의 경우,
- 1을 만들려면 0.1이 2개 필요함.
이때 0.1은 10진수 값으로 치환하면 0.5에 해당하는 값이라 할 수 있음.
0.1 == 2-1 == 1/2
- 0.1을 만들려면 0.01이 2개 필요.
0.01 == 2-2 = 1/4
- 0.01을 만들려면 0.001이 2개 필요.
0.001 == 2-4 = 1/8
...
- 컴퓨터는 이런 식으로 소수 부분을 표현함.
- 실수의 bit 구성
-
만약 0.72475의 값이 있다고할 때, 이를 실수로 표현한다면
- 위의 과정으로 계속해서 소수점 아래 값(가수 부분)을 더해나가야함.
- 하지만 그렇다보면 당연히 정확한 표현이 아니라 최대한 가까운, 근사치를 갖게되는 것.
- double의 경우 더 정교한, 더 자세한 근사치를 얻을 수 있을 것
실수형 자료는 값을 정확하게 표현하는 것이 아님.
근사치를 통해서 최대한 가까운 값으로 나타냄.
-
이러다보니까 실수를 다룰 때, 두 값이 정확하게 일치하지 않을 수 있다는 것.
float a = Method();
a == 1.f;
1f를 반환하는 메서드가 1.f와 같은지 비교하는 것이 성립하지 않을 수 있다는 것.
부동소수점으로 인한 근사값 사용으로 인해서 두 값이 정확하게 일치하지 않을 수 있음.
이런 상황 때문에 실수의 정밀도 개념을 꼭 숙지해야하는 것.