추가자료 : http://blog.naver.com/leojesus?Redirect=Log&logNo=80045980042
아이오 교육센터의 기술자료는 다양한 서적/문서를 참고해서 교육센터 자체로 만든 자료입니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
마음대로 퍼가셔도 되지만 꼭 출처를 밝혀 주시기 바랍니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
float type에 대한 고찰 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
C 에서 실수 type은 아래의 2가지로 나눌수 있습니다. float
Type :
4byte 실수를 표현 하는 타입 이 중에서 float type 에 대하여 역사적 배경에 기반하여 자세히 알아 보겠습니다. 다음 C언어 소스를 컴파일 후 실행 했을 때의 예상되는 값을 머리속으로 추측 해보고 실행하여 나오는 결과 값과 어떻게 차이가 나는 지 살펴 봅시다. 실행한 결과 값이 생각한 값과 같다면 실수의 내부 구조를 정확히 이해 하고 있으므로 더 이상 읽지 않으셔도 좋습니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
정수부
실수부 위 그림을 보면 아주 합리적으로 보입니다. 정확히
메모리의 반을 정수부에 반은 실수부에 할당 하고 있으니까요. 10.25 라는 숫자가 있을 때
부호 지수부
가수부 그림2) 부동 소수점 표현 방법 위에 방식으로 표현 하면 범위 : 2-128 -
2+127 문제점 1 : 1010.01 => 0.101001 * 24 이런식의 이동은 어차피 왼쪽 1의 위치가 마지막 이동부분이므로 항상 0.1 형태로 시작한다. 그러므로 0.1까지 이동하지 말고 1.0 형태로 이동 하면 소수점의 쓸데 없는 1번의 이동을 막을수 있고 이렇게 하면 1bit의 낭비를 막을수 있다. 문제점 2 : 지수부에는 양수도 들어가야 하지만
음수도 들어가야 한다. 이때 음수를 표현하기위해 정수처럼 2의 보수를 사용한다면 10.25 라는 숫자가 있을 때 이를 그림으로 표현하면
부호(s) 지수부(e)
가수부(m) 그림3) IEEE 부동 소수점
표준 메모리에는 위에 그림 처럼 저장 하고 다시 CPU로 로드 할 때는 다음 수식에 따라 로드 된다.
위의 방식은 C언어 뿐만 아니라 C++, java, C# 등 모든 언어에서 사용하는 실수의 표준이므로 개발자하면 반드시 알아야 할 내용입니다. 실수의 내부 구조를 알아야 하는 이유 1. 정확한 실수의 내부구조를 알아서 논리적 에러
없는 코드 구현가능 그렇다면 위 지식을 배경으로 0.1의 내부 구조를 분석해 봅시다. 0.1 라는 숫자가 있을 때 0.1 =>
0.0001100110011.... 이를 그림으로 표현하면
부호(s) 지수부(e)
가수부(m) 그림3) 0.1의 IEEE 부동 소수점
표준 실수 프로램시 가이드 라인)
따라서 처음 프로그램의 올바른 사용예는 다음과 같다.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
결론 : 실수는 부동 소수점을 사용하고
float(32bit: s=>1, e=>8, m=>23), double(64bit: s=>1, e=>11,
m=>52)의 내부구조를 가지고 있습니다. 간단한 실수 프로그램에는 float을 사용하고 정밀한 프로그램에서는 반드시 double을
초정밀도 프로그램에서는 type을 생성하여 사용해야 합니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
visual studio 2010 변화된 것들. pdf (0) | 2012.10.31 |
---|---|
[제2장] C++ 기본 : Reference를 return하는 함수의 정의 (0) | 2012.10.31 |
.ini 파일 클래스 (0) | 2012.10.31 |
문자열 변환 (0) | 2012.10.31 |
wchar_t or char .. (유니코드 출력문제) (0) | 2012.10.31 |