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 |