도라에몽주머니

[Java] 실수형(float, double)의 소수점 표현 방식, 부동소수점 본문

Programming/Java

[Java] 실수형(float, double)의 소수점 표현 방식, 부동소수점

에몽쓰 2022. 9. 21. 09:56

개요

지금까지 미루던 부동소수점 표현 방법 정리.

학부때도 이해한 척 넘어갔는데 이번 수업에 나오길래 다시 한번 정리하기로 했다.

 

 

실수 표현 방법

실수(float, double)를 표현하는 방법에는 크게 2가지가 있다.

고정 소수점 방식과 부동 소수점 방식이다.

 

* 고정 소수점(Fixed Point)

: 소수점의 위치를 미리 고정해두고 10진수를 2진수로 변환하여 그대로 사용하는 방식. 남는 자리는 0으로 채운다.

출처: https://madplay.github.io/post/the-need-for-bigdecimal-in-java

더보기

소수로 표현된 10진수를 2진수로 바꾸는 법을 자꾸 까먹어서 정리.

출처: https://ourcalc.com/2%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98%EA%B8%B0/

 

* 부동 소수점(Floating Point)

: 고정 소수점과는 다르게 10진수를 2진수로 변환하여 그대로 넣지 않고 일련의 과정을 거친다. (아래 설명 참고) 

더 넓은 표현 범위를 가지기 때문에 부동소수점 방식을 더 많이 이용한다.

 

 

 

부동 소수점(Floating Point) 이란

- 대표적인 부동 소수점 자료형은 floatdouble이다. float는 32비트, double은 64비트이다

- 메모리에 표현될 때, 부호부, 지수부, 가수부의 세 부분으로 구성된다

float: 부호부(1자리) + 지수부(8자리) + 가수부(23자리) = 32비트
double: 부호부(1자리) + 지수부(11자리) + 가수부(52자리) = 64비트

 

 

실수를 메모리에 표현하는 방법

ex) -118.625를 메모리에 표현하기

 

1. -118.625는 음수이므로 부호부를 1로 설정해준다

출처: https://velog.io/@maketheworldwise/float-double-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

 

2. 절대값인 118.625를 이진법으로 나타내준다

# 정수부 변환
118 (10진수)
= 1110110 (2진수)

# 소수부 변환
0.625 (10진수)
= 0.625 x 2 = 1.25  →  정수부 1
= 0.25 x 2 = 0.5  →  정수부 0
= 0.5 x 2 = 1  →  정수부 1

# 이진법 변환 결과
118.625
= 1110110.101

 

3. 정수부가 한자리가 되도록 변환해준다. (X.XXXXXX * 2^n의 형태로 변환)

1110110.101  →  1.110110101 x 2^6

 

4. 소수점 아래부분이 가수부가 되도록 가수부의 남은 bit자리를 0으로 채워준다. (23bit)

1101 1010 1000 0000 0000 000 x 2^6

 

5. 위에서 구한 bit를 가수부로 설정한다.

출처: https://velog.io/@maketheworldwise/float-double-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

 

6. 지수부에 편향값(bias)을 더해준 후 이진수로 변환해준다.

* float의 편향값: 127
  double의 편향값: 1023

# 지수부 + 편향값 (float)
6 + 127
= 133 (10진수)
= 10000101 (2진수)

 

7. 위에서 구한 bit를 지수부로 설정한다.

출처: https://velog.io/@maketheworldwise/float-double-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

 

 

Reference

https://velog.io/@maketheworldwise/float-double-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

https://bigpel66.oopy.io/library/c/chewing-c/4

https://gsmesie692.tistory.com/94