본문 바로가기
VisualStudio.C++.C#/C . C++

C/C++ 실수형 float, double 표준 IEEE754. 실수자료형 사용시 주의사항.

by 리치굿맨 2016. 2. 18.


 

개요

 
C/C++ 컴파일러들 (Keil, GCC, Visual C++ 포함) 의 실수형 수(floating-point numbers, 부동소수점 수 ) "표현" 표준 IEEE754

single-precision : 32bit, float.  표현가능 값 : ±1.18×1038 to ±3.4×1038
double-precision : 64bit, double. 표현가능 값 : ±2.23×10308 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... 일 것으로 전제하고 아래 같은 방식의 크기 비교 처리하게되면 프로그램은 엉뚱한 결과를 준다. 

 

실수자료형에서 아래와 같은 방식으로 각 변수의 값이 정확할것임을 가정한 비교 처리 하면 안됨.

 

if( X == 1.0)
if(X == Y)
if( X > Y)
... 등등.
 


해결책.


실수자료형에서 비교시 최소 기준값 필수 적용할것.


예.
double MinDelta = 0.000001; // 같다의 정도를 정하는 기준값. 코드 로직 상황에 따라 임의 지정가능.

if( fabs(X - 1.0) < MinDelta) // X가 1.0과 같은지 비교
if ( fabs(X- Y ) < MinDelat) // X와 Y가 같은지 비교.
if( (X- Y) > MinDelta) // X가 Y보다 큰지 비교.

 

 


 

 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 


///669.

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT