2013-01-05 3 views
8

가능한 중복 :
NaN Literal in C?ANSI C에서 NaN 값을 정의하는 방법은 무엇입니까?

내가 매개 변수로 두 개의 번호를 수신 ANSI C에서 함수를 쓰고 있어요. 매개 변수는 int 또는 float 유형입니다. 번호는 내 필터에 따라 유효하거나 유효하지 않을 수 있습니다. 어떤 의미의 실패를 반환하는 방법은 무엇입니까? 반환 유형은 float입니다. 내 마음에 가장 먼저 오는 것은 NaN 추상 유형이었습니다. 하지만

ANSI C로 그것을 표현하는 방법을 모른다 (내 나쁜 영어 죄송합니다. 영어가 모국어가 아닌)

+0

@OliCharlesworth :하지만 그것의 C99는 답변 – Jack

+0

하나는'0.0/0.0'을 제안했다. –

+1

절대적으로 이식 가능한 방법은 없지만 NaN은 C89에 없으며 C99에서 필수 항목이 아닙니다. – effeffe

답변

12

NaN은 "추상적 유형"이 아닙니다. 이것은 부동 소수점 데이텀의 값입니다.

"ANSI C"에 의해 당신이 (많은이 하나를 가지고로, 용어의 실제 의미이다) 표준 C를 의미하는 경우 <math.h>와 유모를 생산하기 위해 NAN 매크로를 사용하고 isnan(x)을 포함 하나를 감지 할 수 .

"ANSI C"는 오랫동안 대체 된 C89 표준 (일부 사람들이 의도적으로 올바르지 않더라도)을 의미하며, 0./0.을 사용하여 NaN 값을 생성하고 x != x으로 하나를 확인하십시오 .

+0

코드에서 C99 또는 그 이상으로 컴파일되지 않는 것을 감지 한 후 매크로에 'NAN'및 'isnan'을 정의하여 작은 래퍼를 만들 수도 있습니다. – Will

+0

@ 윌 : 확실히, 나는 '0/0.''NAN' 매크로의 요구 사항을 공식적으로 만족시킵니다 (즉, 정적 초기화에 유용해야 함). 여전히 대부분의 사용자가 걱정할 필요는 없습니다. –

+2

@StephenCanon'0./0.'는 상수 표현이므로 정적 초기화에서는 문제가 없습니다. – ouah

4

문제 수에 따라 유효하지 않을 수 있습니다 내 "나는 어떤 값을 의미 실패를 반환 어떻게 다음 필터링

를 대신이 사용할 수 NaN의에 대한 번호를 비교하는?은 C에서 언급 한 바와 같이

if (x != x) // x is NaN 

을 이 표현식 0.f/0.f을 사용하여 C89에서 float NaN 값을 생성 할 수 있습니다.

+0

OP는 NaN을 확인하는 방법을 묻지 않았습니다. –

-2

당신은 할 수 없어이

if(your_variable != your_variable) 
{ 
    return 0; //catch 0 as the failure returned value 
} 
else 
{ 
    //your code 
} 
+0

-1이 답변에는 아무 것도 설명되어 있지 않기 때문에 NaN을 사용하는 방법에 대해 이미 알고있는 사람이 아니라면 즉시 혼란에 빠질 수있는 코드를 포함하고 있습니다. 또한 '0'은 완전히 합리적으로 반환 값이 될 수 있기 때문입니다. –

2

같은 것을 가지고, 두 개의 변수 값 하나, 실패 플래그를 반환해야합니다.

예를 들어 정상 작동시 함수가 사실을 반환하도록 설정할 수 있습니다. 오류 (NaN)의 경우 거짓입니다.

결과를 저장하는 변수는 참조로 매개 변수로 전달되고 성공한 경우 반환 값을 보유합니다.

BOOL myFunction(int inInt, float inFloat, float *outResult) 
{ 
    /* 
     PROCESSING HERE 
    */ 

    // in case of failure 

    if(/* failure condition here */) 
    { 
     *outResult = 0; 
     return false; 
    } 

    *outResult = /* your result */ 

    return true; 
} 


// how to use the function 

int a; 
float b; 
float result; 
BOOL success; 

success = myFunction(a, b, &result); 

if(success) 
{ 
    // do whatever with your "result" 
} 
else 
{ 
    // NaN 
} 
관련 문제