본문 바로가기

it관련

float double 비교

반응형

float double 비교




숫자를 비교할 때

실수(float 또는 double)의 경우 자리수의 제한 때문에 오차가 생기는데

다음 소스를 수행하면 원치않는 결과가 나오는 것을 확인할 수 있습니다.

[code]

#include <stdio.h>

#include <stdlib.h>

 

#define fnum 3.14

int main(void)

{   

 float f=fnum;

 if(f==fnum)

 {

  printf("f는 %f입니다.\n",fnum);

 }else

 {

  printf("f는 %f이 아니고 %.20f입니다.\n",fnum,fnum);

 }


 return 0;

}

[/code]

수행결과

 

f는 3.140000이 아니고 3.14000000000000010000입니다.

계속하려면 아무 키나 누르십시오 . . .

 

해결하는 방법은 수학에서 사용하는 아주작은 숫자(입실론)을 적용하는 것이 좋은 방법인것 같습니다.

 

 

이때 EPSILON은 float일경우는 FLT_EPSILON, double일 경우는 DBL_EPSILON을 사용하는데

FLT_EPSILON과 DBL_EPSILON은 float.h에 다음과 같이 정의 되어 있습니다.

#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */

#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */

 

이것을 이용해서 프로그램을 수정하면

 

[code]

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <float.h>

#define fnum 3.14

 

int isequaldbl(double val1, double val2)

{

 return fabs(val1 - val2) <= (DBL_EPSILON * fabs(val1));

};

int isequalflt(float val1, float val2)

{

 return fabs(val1 - val2) <= (FLT_EPSILON * fabs(val1));

};

int main(void)

{   

 float f=fnum;

 if(isequalflt(f,fnum))

 {

  printf("f는 %f입니다.\n",fnum);

 }else

 {

  printf("f는 %f이 아니고 %.20f입니다.\n",fnum,fnum);

 }


 return 0;

}

[/code]

 

수행결과는 다음과 같이

 

f는 3.140000입니다.

계속하려면 아무 키나 누르십시오 . . .

 

원하는 결과를 얻을 수 있습니다.

반응형

'it관련' 카테고리의 다른 글

인텔 샌디브릿지,아이비브릿지  (0) 2017.05.22
C언어로 C++ string클래스 따라하기  (0) 2017.05.22
망중립성  (0) 2017.05.21
연결 리스트 맛보기  (0) 2017.05.21
현재 나온 이동통신 네트워크들  (0) 2017.05.21