티스토리 뷰
컴퓨터는 인간과 달리 정수 5와 실수 5.0을 다른 것으로 취급한다. 인간은 자료에 대한 형태를 자동으로 판단하기 때문에, 문제없이 처리하지만, 컴퓨터 즉 기계는 그렇지 않다. 이번 글에서는 컴퓨터에서 데이터를 저장할 때 정수방식으로 저장하는 것과 실수방식으로 데이터를 저장하는 방식을 알아보고, 그렇기 때문에 데이타타입이 왜 필요한지에 대해 고민해보자.
정수 5를 메모리에 저장할 때는 아래와 같다.
하지만, 실수는 다르다. 실수는 IEEE Floating-Point 표준 변환법을 따라야 한다. <IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985> 에 의해서 변환해보자. 다음과 같은 순서가 필요하다.
1. 부동소수점 5.0을 이진화한다.
2. 2의 지수법으로 정규화한다.
1. 부호부 : 0 (양수)
2. 지수부 : 129 ( 2승(위에서 정규화부분에서 2의 2승이기 때문) + 127)
3. 가수부 : 01 (위의 정규화부분에 있는 1.01 중에서 소수점 이하의 수만 사용)
그런데, 대부분의 프로그래밍 언어에서는 실수를 float(4Byte) 와 double(8Byte) 두가지로 나눠서 사용하고 있다. 각각 어떻게 저장하는지 살펴보자.
1. float type(32bit) --> 부호부(1bit) + 지수부(8bit) + 가수부(23bit)
2. double type(64bit) --> 부호부(1bit) + 지수부(11bit) + 가수부(52bit)
따라서 실수 5.0 을 float 타입으로 저장하면 아래와 같다.
1. 0(부호부) 10000001(지수부) 01000000000000000000000(가수부)
2. 8bit 씩 묶는다(16진수 변환을 위해) 01000000 10100000 00000000 00000000
3. 16진수로 변환한다. 40 A0 00 00
그래서 실제로 float 변수에 저장하는 5.0은 40 A0 00 00 으로 저장한다. 그렇다면 컴퓨터는 같은 실수인 5.0을 저장할 때 float 와 double을 같이 인식할까? 정답은 당연히 아니다. 왜냐하면 위의 float 와 double 의 예를 들었듯이 각각 부호부는 같지만, 지수부의 사이즈가 다르고 가수부의 사이즈가 다르다. 이 부분이 다르면 결국 16진수로 변환될때 값도 다르고 사이즈가 다르다. 그렇기 때문에 같은 실수 5.0이라도 float 로 저장할 때와 double 로 저장할 때의 값이 달라지는 것이다. 프로그래밍에서는 같은 실수라도 그래서 정확한 데이타 타입을 사용해야 하는 이유가 바로 이것이다.
출처 : http://en.wikipedia.org/wiki/IEEE_754-1985
「소설같은 자바」
정수 5를 메모리에 저장할 때는 아래와 같다.
- 정수 : 5
- 변환 : 00000000 00000000 00000000 00000101(2)
하지만, 실수는 다르다. 실수는 IEEE Floating-Point 표준 변환법을 따라야 한다. <IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985> 에 의해서 변환해보자. 다음과 같은 순서가 필요하다.
1. 부동소수점 5.0을 이진화한다.
2. 2의 지수법으로 정규화한다.
- 부동소수점수 : 5.0
- 이진화 : 101.0(2)
- 정규화 : 1.01 X 2
2 (1.xxx가 되도록 변환)
- 부호부는 만일 양의 수이면 0을, 음의 수이면 1을 사용한다.
- 지수부는 지수승에 127을 더한다.
- 가수부는 소수점 이하 그대로 사용한다.
1. 부호부 : 0 (양수)
2. 지수부 : 129 ( 2승(위에서 정규화부분에서 2의 2승이기 때문) + 127)
3. 가수부 : 01 (위의 정규화부분에 있는 1.01 중에서 소수점 이하의 수만 사용)
그런데, 대부분의 프로그래밍 언어에서는 실수를 float(4Byte) 와 double(8Byte) 두가지로 나눠서 사용하고 있다. 각각 어떻게 저장하는지 살펴보자.
1. float type(32bit) --> 부호부(1bit) + 지수부(8bit) + 가수부(23bit)
2. double type(64bit) --> 부호부(1bit) + 지수부(11bit) + 가수부(52bit)
따라서 실수 5.0 을 float 타입으로 저장하면 아래와 같다.
1. 0(부호부) 10000001(지수부) 01000000000000000000000(가수부)
2. 8bit 씩 묶는다(16진수 변환을 위해) 01000000 10100000 00000000 00000000
3. 16진수로 변환한다. 40 A0 00 00
그래서 실제로 float 변수에 저장하는 5.0은 40 A0 00 00 으로 저장한다. 그렇다면 컴퓨터는 같은 실수인 5.0을 저장할 때 float 와 double을 같이 인식할까? 정답은 당연히 아니다. 왜냐하면 위의 float 와 double 의 예를 들었듯이 각각 부호부는 같지만, 지수부의 사이즈가 다르고 가수부의 사이즈가 다르다. 이 부분이 다르면 결국 16진수로 변환될때 값도 다르고 사이즈가 다르다. 그렇기 때문에 같은 실수 5.0이라도 float 로 저장할 때와 double 로 저장할 때의 값이 달라지는 것이다. 프로그래밍에서는 같은 실수라도 그래서 정확한 데이타 타입을 사용해야 하는 이유가 바로 이것이다.
출처 : http://en.wikipedia.org/wiki/IEEE_754-1985
「소설같은 자바」
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Flex
- PHP
- Fedora
- JAR
- J2SE
- Android
- Windows 8.1
- 리눅스
- classpath
- mysql
- CSS3
- 원격로그인
- SQL
- ubuntu
- Apache
- JDBC
- dev-c++
- windows 7
- AJAX
- javascript
- Linux
- EditPlus
- Eclipse
- Installation
- Javadoc
- ftp서버
- command tools
- Fedora14
- 우분투
- LECTURE
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함