Objective-C-nan에 대한 float 검사


78

float slope가끔 0으로 나누기가 발생하기 때문에 출력 될 때 가끔 nan 값을 갖는 변수 ( )가 있습니다.

그럴 때 if-else를 시도하고 있습니다. 어떻게 할 수 있습니까? if (slope == nan)작동하지 않는 것 같습니다.



1
float 또는 double에 대한 Objective-C : isnan(slope); FloatingPointType에 대한 스위프트 :slope.isNaN
Cœur

답변:


207

다소 동등한 두 가지 방법 :

if (slope != slope) {
    // handle nan here
}

또는

#include <math.h>
...
if (isnan(slope)) {
    // handle nan here
}

( man isnan더 많은 정보를 제공하거나 C 표준에서 모든 내용을 읽을 수 있습니다)

또는 나누기를 수행하기 전에 분모가 0임을 감지 할 수 있습니다 (또는 다른 계산을 수행하는 대신 기울기에서 사용하는 atan2경우에만 사용 atan).


94
내가 if (foo != foo)어떤 코드에서 우연히 만난 적이 있다면 나는 매우들을 수있는 "WTF"를 내놓을 것이다. 훨씬 더 명확하고 읽기 쉬운 방법 isnan처럼 보입니다 .
Alex Wayne

5
@Squeegy : 부동 소수점에 익숙한 사람에게는 똑같이 읽습니다. 그렇지 않은 사람에게는 예, isnan훨씬 더 분명합니다.
Stephen Canon

2
@AndrewHeinlein : 정확히는 아닙니다. 그것은에 확장 x != x당신이에게 전화로 확장되는 경우 -ffast - 수학 또는 유사한로 컴파일하지 않는 한, __isnanf또는 __isnand(때문에 x != x-ffast - 수학에서 제대로 작동하지 않습니다). 따라서 일반적으로 isnan.
Stephen Canon

1
그러나, 어떤 않는 __isnanf__isnand에 확장?
Andy

1
@IulianOnofrei는 NaN이 NaN을 포함하여 어떤 것과도 같지 않은 것으로 정의 되었기 때문입니다.
스티븐 캐논

35

자신을 NaN포함하여 동일하지 않습니다 NaN. 그래서 확인하십시오 x != x.


5
 if(isnan(slope)) {

     yourtextfield.text = @"";
     //so textfield value will be empty string if floatvalue is nan
}
else
{
     yourtextfield.text = [NSString stringWithFormat:@"%.1f",slope];
}

이것이 당신을 위해 일하기를 바랍니다.


2

Swift에서는 slope.isNaNNaN인지 확인 해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.