개요 | |
C/C++ 컴파일러들 (Keil, GCC, Visual C++ 포함) 의 실수형 수(floating-point numbers, 부동소수점 수 ) "표현" 표준 IEEE754
single-precision : 32bit, float. 표현가능 값 : ±1.18×10−38 to ±3.4×1038
double-precision : 64bit, double. 표현가능 값 : ±2.23×10−308 to ±1.80×10308
IEEE754 정의
상기 표현 규칙 자체는 응용프로그램 코딩하는 경우에 활용할 일은 없으나, 표현 형식의 한계 때문에 발생하는 수학에서의 숫자와는 다른 동작이 코드상에서 발생할 수 있음을 알고 있어야 함이 중요하다.
특히 실수형 변수들의 크기 비교 연산시 수학에서의 숫자처럼 생각하고 처리하면 의도하지 않은 황당한 결과가 나온다. 이들 오류의 근원이 컴파일러에서의 실수형 표현의 한계에서 비롯된 것임을 숙지하고 논리적 오류가 발생하지 않도록 코드 작성함이 중요.
| |
|
실수 자료형 사용시 주의사항 | |||
간단한 예.
double X = 0.7;
double Y = 2.0;
X += 0.3;
Y = Y/2.0;
위 코드의 로직과 같이 상식적으로는 정확히 1.000000000000... 이 변수 X에 들어와 있을 것이라 기대하겠지만, 전산처리된 변수 X 에는 정확히 1.00000000000000... 이라는 보장이 없음. 즉, 1.0000000000..0001 혹은 0.99999999999999 와 같은 식으로 변수값에 1.00000000000... 이 아닌 데이터가 있을 수 있음을 항상 염두에 둬야 한다.
이런 한계가 있음을 고려치 않고, 실수형 변수 X 의 실제 데이터가 확정적으로 1.000000... 일 것으로 전제하고 아래 같은 방식의 크기 비교 처리하게되면 프로그램은 엉뚱한 결과를 준다.
| |||
|
본 글이 포함된 상위 정리 장소.
Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11
|
///669.
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
C++ 클래스 static 변수 초기화. (0) | 2017.03.13 |
---|---|
C++ std::chrono, time_point, duration, system_clock, steady_clock 고정밀 시각, 시간. (0) | 2016.02.20 |
C++ std::thread 클래스 이용한 스레드. 클래스멤버함수를 스레드로 실행시키는 방법. (0) | 2016.01.16 |
C++. 함수 인자로 포인터 전달하고 함수내에서 동적 메모리 할당 받기 2가지 방식. ** *& (1) | 2016.01.04 |
C++. 파생 클래스에서 베이스 클래스의 인자 있는 생성자 실행되게 처리법 (1) | 2015.12.28 |
댓글