한결과 레지아이스

TIL about Floating Point, 22/02/20 본문

Today I Learned/The Secret Life of Programs

TIL about Floating Point, 22/02/20

miniwho 2022. 2. 20. 20:39

오늘은 부동소수점에 대해 공부했습니다.

왜 부동 소수점(floating point)라고 부를까?

그와 반대되는 고정 소수점(fixed point)을 보면 이해할 수 있습니다.

4개의 비트를 사용해 (2진)소수를 표현한다 가정하고 예시를 들어보겠습니다.

2개의 비트는 소수점 왼쪽의 정수부를, 2개의 비트는 소수점 오른쪽의 분수부를 표현하는데 사용할 수 있습니다.

이런식으로 표현하게 되면 소수점의 위치가 항상 동일합니다. 비트가 4개 뿐이라 표현범위가 좁아 보이지만, 비트 수가 충분하다면 소수를 표현하기 좋은 표현법이라고 합니다. 실제로 고정 소수법을 사용하는 컴퓨터가 있기도 하고요. 하지만 쓸모 있는 범위의 소수를 표현하기 위해 너무 많은 비트 수를 필요로 하기에, 일반적인 컴퓨터는 조금 더 효율적인 부동 소수점 방식을 사용합니다.

부동 소수점 방식은 뭐가 다르냐 하면, 소수점의 위치가 고정이 아닙니다..! 무슨 말인지 저도 잘 와닿지 않는데, 일단 설명을 먼저 해볼게요. 부동 소수점 방식에선 소수를 가수와 지수로 나눠서 표현합니다.

10진 소수로 예를 들어보면, 1.5629 * 10^-28 이런 식으로 가수부의 소수점은 고정되어 있고 지수부가 오락가락하며 소수를 표현하는 방식이 부동 소수점 방식이라고 합니다.

가수부가 소수의 자리수를 정해주는데, 이게 고정되어있지 않으니 부동 소수점이라고 하나봅니다.

또다시 4비트로 소수를 표현하는 예시를 들어볼게요.

홈메이드라 조금... 지저분합니다. (가수도 기수라고 써놨네요..)

기수 * 2^지수의 형태로 되어있습니다. 지수는 밑이 2로 고정입니다.

가수가 0.1, 지수가 00 일때는 1/2 * 2^0이라 0.5가 됩니다.

가수가 0.1, 지수가 01 일때는 1/2 * 2^0 이라 1이 됩니다.

가수의 소수점은 고정인 것 같지만 지수에 따라 소수점의 위치가 바뀌는데, 이래서 부동 소수점이라고 한다고 합니다. 비트 수가 적어서 예시가 좀 부족한 것도 같습니다.

단점도 있는데요, 보면 0을 표현하는 방법이 4개나 있는 걸 볼 수 있습니다. 다른 숫자들도 표현법이 겹치는 경우가 있습니다. 그리고 모든 수를 표현할 수는 없다는 것도 단점입니다. 그래서 부동소수점에선 정밀도를 따지는가봅니다.

부동소수점은 어떻게 사용되고 있을까?

낭비되는 조합을 최소화하고 반올림을 쉽게(원래는 어려운가봐요..)하기 위한 트릭을 적용하고 이것 저것 많이 해서 IEEE 부동소수점 수 표준을 사용한다고 합니다.

32비트(float)에서는 가수에 대한 부호를 위한 1비트, 지수에 8비트, 나머지 비트는 모두 가수부를 위해서 사용합니다. +-10^38정도의 범위를 표현할 수 있는데, 정밀도가 7비트라고 합니다. 정밀도가 무슨 의미인지는 모르겠지만, 가수에 지수를 곱해 유사값으로 나타내다보니 정확한 수 표현이 안되나 봅니다. 그래서 Int와 Float를 비교할때 == 연산자를 사용하지 못하나봐요.

64비트(double)에서는 지수에 조금 더 투자해서 11비트, 부호 1비트를 제외한 나머지가 가수부를 위해 쓰이고요. +-10^308의 범위를 표현한다고 합니다. 소수점까지 표현하는데 같은 비트를 사용하는 int와 long보다 더 표현범위가 넓은게 의아했는데, 표현법이 달라서 그런거였스요..

Comments