지수부분이 000 0000 이면,
0000 0000 xxxxxxxx... 은 0으로 나오고
1000 0000 xxxxxxxx... 은 -0으로 나오고
둘 중 아래 형태가 제가 이전에 다른 글타래에서 말씀드린 signed zero
입니다. IEEE 754 를 가정했을 때 대부분의 문맥에서 -0 과 0 은 동일하게
행동하지만 구현에 따라 underflow 같이 미묘한 경우 제 역할을 수행하기도
합니다.
wslee wrote:
0111 1111 xxxxxxxx...
1111 1111 xxxxxxxx...
이렇게 지수부분이 111 1111 이면
숫자가 안찍히고 nan이 라고 찍히던데요
float나 double에서 특히 이렇게
nan으로 되어있을때
이것을 구분해 낼수 있는 방법은 뭐 없을까요?
if( 실수 == nan)
블라블라블라;
doldori 님께서 알려주셨듯이 대부분의 구현체에서 isnan() 을 사용하실 수
있습니다. 이는 C99 표준에서 공식적으로 제공되며, 그 이전에도 적지 않은
구현체가 확장으로 제공해주고 있었습니다. (혹은 각 type 별로 __isnan(),
__isnanf(), __isnanl() 와 같은 이름으로 제공해 주기도 합니다. 단,
isnan() 이 이미 제공된다면 이들을 사용하는 것은 바람직하지 않습니다.)
혹은 isnan() 을 제공하지 않는 구현체의 경우, 보통 다음과 같이 테스트할
수 있습니다.
if (x != x)
/* NaN 에 대한 처리 */
C99 isnan() 과의 차이점은 isnan() 의 경우 검사 전에 type 에 대한
처리를 해준다는 점입니다. 예를 들어, 어떤 환경에서 double 형(semantic
type)으로 선언된 값을 사실상 내부적으로 long double 형(representation
type)으로 처리하고 있었다면, isnan() 매크로의 경우 이를 확실히 double
형의 표현이 되도록 만들어준 후에 검사를 하게 됩니다. 이와 같은 차이는
여러 부동형 중 일부 type 에만 NaN 을 지원하는 경우에만 문제가 될 수
있습니다 - IEEE 754 환경을 경우 그럴 수 없으므로 문제가 되지 않습니다.
C99 와의 forward compatibility 를 위해 위와 같은 검사를 매크로로
만들어 사용할 경우 인자 평가 횟수에 유의하시기 바랍니다. C99 의
isnan() 매크로의 경우 인자를 1번만 평가하도록 구현되어 있습니다.
일단 부동형 상수의 표현 방식은 구현체 의존적이므로 이 질문에 대한 답은
일단 부동형 상수의 표현 방식은 구현체 의존적이므로 이 질문에 대한 답은 "환경에
따라 다르다"입니다.
참고로 널리 사용되고 있는 IEEE 754의 경우 zero를 정규화된 방식으로 표기할 수
없기 때문에 zero를 특수한 값으로 취급하며 +0과 -0을 구분합니다. (signed zero)
자세한 얘기는
What Every Computer Scientist Should Know About Floating-Point Arithmetic
을 참고하십시오.
[quote="doldori"]일단 부동형 상수의 표현 방식은 구현체 의
음 다 읽어보긴 불가능하고요 -_-;;
지수부분이 000 0000 이면,
0000 0000 xxxxxxxx... 은 0으로 나오고
1000 0000 xxxxxxxx... 은 -0으로 나오고
0111 1111 xxxxxxxx...
1111 1111 xxxxxxxx...
이렇게 지수부분이 111 1111 이면
숫자가 안찍히고 nan이 라고 찍히던데요
float나 double에서 특히 이렇게
nan으로 되어있을때
이것을 구분해 낼수 있는 방법은 뭐 없을까요?
if( 실수 == nan)
블라블라블라;
[quote="wslee"]float나 double에서 특히 이렇게
isnan()이 있습니다.
[quote="doldori"][quote="wslee"]float나 d
아하 그런게 있었군요.
감사합니다.
[quote="wslee"]지수부분이 000 0000 이면, 0000
둘 중 아래 형태가 제가 이전에 다른 글타래에서 말씀드린 signed zero
입니다. IEEE 754 를 가정했을 때 대부분의 문맥에서 -0 과 0 은 동일하게
행동하지만 구현에 따라 underflow 같이 미묘한 경우 제 역할을 수행하기도
합니다.
doldori 님께서 알려주셨듯이 대부분의 구현체에서 isnan() 을 사용하실 수
있습니다. 이는 C99 표준에서 공식적으로 제공되며, 그 이전에도 적지 않은
구현체가 확장으로 제공해주고 있었습니다. (혹은 각 type 별로 __isnan(),
__isnanf(), __isnanl() 와 같은 이름으로 제공해 주기도 합니다. 단,
isnan() 이 이미 제공된다면 이들을 사용하는 것은 바람직하지 않습니다.)
혹은 isnan() 을 제공하지 않는 구현체의 경우, 보통 다음과 같이 테스트할
수 있습니다.
C99 isnan() 과의 차이점은 isnan() 의 경우 검사 전에 type 에 대한
처리를 해준다는 점입니다. 예를 들어, 어떤 환경에서 double 형(semantic
type)으로 선언된 값을 사실상 내부적으로 long double 형(representation
type)으로 처리하고 있었다면, isnan() 매크로의 경우 이를 확실히 double
형의 표현이 되도록 만들어준 후에 검사를 하게 됩니다. 이와 같은 차이는
여러 부동형 중 일부 type 에만 NaN 을 지원하는 경우에만 문제가 될 수
있습니다 - IEEE 754 환경을 경우 그럴 수 없으므로 문제가 되지 않습니다.
C99 와의 forward compatibility 를 위해 위와 같은 검사를 매크로로
만들어 사용할 경우 인자 평가 횟수에 유의하시기 바랍니다. C99 의
isnan() 매크로의 경우 인자를 1번만 평가하도록 구현되어 있습니다.
그럼...
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기