제목 그대로입니다.
printf해보면 0.000000으로 뜨는데, 0.000000 <= 0.0 하니까 false가 뜨네요.
비슷한 현상 겪으신 분 계시는가요?
당연한거 아닌가요?
좋은 하루 되세요!!
실수는 지수형식으로 표현되기때문에 비교연산이 부정확한 경우가 있습니다.
Floating Point에서 정확한 비교가 불가능하다고 알고 있는데요... 그래서 오차 범위를 지정해서 비교해야 한다고 알고 있습니다.
깊이 알고 싶으시다면... 뭘 봐야할까요...? ㅡㅡ??
부동소수점 값이 메모리에 저장될 때 어떤 꼴로 저장되는지에 대한 정보만 조금 얻어볼 수 있다면 이해라도 갈 텐데 말이죠 :) 가령 int라면 aa aa aa aa라던지.. ---------------- agidari.wordpress.com
sizeof(float) == sizeof(void *) 라는 가장하에
union { float f; void *p; } float_hex; float_hex.f = 0.00000001; printf("%p\n", float_hex.p);
http://en.wikipedia.org/wiki/IEEE_754-1985
0.0000001을 %.6f하면 0.000000이라고 나오겠죠. 혹시 %e 혹은 %g로 찍어보셨나요?
실수는 지수형식으로 표현되기때문에 ...
그래서 실제로 완전한 0이 존재하질 않는다고 알고 있습니다
0, 1, 0.5(0.1(2)), 0.25(0.01(2)) 등 2진수 유한 소수로 표현 가능한 숫자는 정확히 저장할 수 있습니다. (물론 저장 단위가 유한한만큼 유효숫자 자리수와 지수의 크기의 제한은 있습니다)
물론 당연합니다만...
제가 예전에 공부했던 바로는...
±(1.m)*2^(e^-127)
이런 방식으로 실수를 표현합니다. 그래서 2^n승 꼴이므로 완전한 0은 절대 있을 수 없다는 얘기지요.
이러한 표현 형태가 일반적이지만 이게 전부가 아닙니다, 0, infinity, 에러 조건을 나타내기 위한 특수 포맷이 따로 있습니다.
모든 bit가 0이면 +0.0, sign bit만 1이면 -0.0을 나타냅니다. 0이 +- 두 개가 있으니 수학의 0과는 좀 다릅니다만, 이건 예를 들자면 1/+infinity = +0, 1/-infinity = -0 같은 식으로 쓰이는 거죠.
http://en.wikipedia.org/wiki/IEEE_floating-point_standard
감사합니다.. 덕분에 좋은 공부가 되었군요 :)
실수를 비교할 때에는 어느 정도 적당히 작은 수 입실론을 상수로 정의해서 그 오차영역 이내인지 아닌지를 가지고 동일성을 판단하십시오.
inline int real_equal(const double d1, const double d2) { double eps = 0.00000000001; // 적당히 작은 수. double d = d1 - d2; if ( -eps < d && d < eps ) return 1; return 0; }
음... 제가 산수에 약해서... 이거 맞는 코드인가요? -_-; 하여간 이런식으로 하면 됩니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
당연한거 아닌가요?
당연한거 아닌가요?
좋은 하루 되세요!!
실수는 지수형식으로
실수는 지수형식으로 표현되기때문에 비교연산이 부정확한 경우가 있습니다.
Floating Point에서
Floating Point에서 정확한 비교가 불가능하다고 알고 있는데요...
그래서 오차 범위를 지정해서 비교해야 한다고 알고 있습니다.
깊이 알고 싶으시다면... 뭘 봐야할까요...? ㅡㅡ??
흐음..
부동소수점 값이 메모리에 저장될 때 어떤 꼴로 저장되는지에 대한 정보만 조금 얻어볼 수 있다면 이해라도 갈 텐데 말이죠 :) 가령 int라면 aa aa aa aa라던지..
----------------
agidari.wordpress.com
sizeof(float) == sizeof(void
sizeof(float) == sizeof(void *) 라는 가장하에
Hm...
http://en.wikipedia.org/wiki/IEEE_754-1985
0.0000001을 %.6f하면
0.0000001을 %.6f하면 0.000000이라고 나오겠죠. 혹시 %e 혹은 %g로 찍어보셨나요?
인용:실수는
그래서 실제로 완전한 0이 존재하질 않는다고 알고 있습니다
0, 1, 0.5(0.1(2)),
0, 1, 0.5(0.1(2)), 0.25(0.01(2)) 등 2진수 유한 소수로 표현 가능한 숫자는 정확히 저장할 수 있습니다.
(물론 저장 단위가 유한한만큼 유효숫자 자리수와 지수의 크기의 제한은 있습니다)
물론 그렇습니다만..
물론 당연합니다만...
제가 예전에 공부했던 바로는...
이런 방식으로 실수를 표현합니다. 그래서 2^n승 꼴이므로 완전한 0은 절대 있을 수 없다는 얘기지요.
이러한 표현 형태가
이러한 표현 형태가 일반적이지만 이게 전부가 아닙니다, 0, infinity, 에러 조건을 나타내기 위한 특수 포맷이 따로 있습니다.
모든 bit가 0이면 +0.0, sign bit만 1이면 -0.0을 나타냅니다. 0이 +- 두 개가 있으니 수학의 0과는 좀 다릅니다만, 이건 예를 들자면 1/+infinity = +0, 1/-infinity = -0 같은 식으로 쓰이는 거죠.
http://en.wikipedia.org/wiki/IEEE_floating-point_standard
덕분에 하나 배웠네요 :)
감사합니다.. 덕분에 좋은 공부가 되었군요 :)
실수를 비교할
실수를 비교할 때에는
어느 정도 적당히 작은 수 입실론을 상수로 정의해서
그 오차영역 이내인지 아닌지를 가지고 동일성을 판단하십시오.
inline int real_equal(const double d1, const double d2)
{
double eps = 0.00000000001; // 적당히 작은 수.
double d = d1 - d2;
if ( -eps < d && d < eps ) return 1;
return 0;
}
음... 제가 산수에 약해서... 이거 맞는 코드인가요? -_-;
하여간 이런식으로 하면 됩니다.
댓글 달기