2012-04-17 4 views
6

값이 0 인 float보다 언트 된 float이 주어 졌을 때 다른 방법을 사용해야하는 메서드가 있습니다. 기본적으로 변수가 있는지 여부를 확인해야합니다. 0언 세트 된 플로트와 값이 0 인 플로팅을 어떻게 구별 할 수 있습니까?

그래서

, 의 나는 변수가 설정되지 않은 경우이 (전무는, NULL, NO 등) 및 방법 0의 값에 true를 반환하지 않고보고 테스트 할 수 있습니다 설정되지 않은 값으로 어떤 자리를 사용한다 ?

+0

왜 NaN (말하자면 1.0/0.0)입니까? float가 NaN인지 테스트하려면, 그냥 num! = num' (NaN은 그 자체가 아님)이어야합니다. – cHao

+0

0으로 나누기로 NaN을 얻는 것은 위험합니다. 신호음을 발생 시키거나 생성 할 수 있으므로 –

+0

더 좋은 방법이 있습니까? 나는 의도적으로 생성하는 방법에 대해 걱정할 정도로 NaN을 망쳐 놓지는 않았습니다. :) 꽤 확실한'NaN'은 float 리터럴로 작동하지 않을 것입니다 ... – cHao

답변

16

당신은 (예를 들어, nan() 또는 nanf()를 호출하여) NaN이에 수레를 초기화하고 숫자를 개최 변경된 경우 다음 isnan()으로 테스트 할 수 있습니다. (myvalue == nan() 것이다 하지 작업을하는 테스트를합니다.)

이 모두 오히려 간단하다 (당신은 아마 어떤 경우에 math.h을 포함한다)와 개념적으로 분별 : 숫자로 설정되지 않은 모든 값이 "숫자가 아닌" ...

+5

신난다, 고마워! 나는'CGFloat myFloat = NAN;과'if (isnan (myFloat)) {...}'로 작업하게했다. – Nathan

+0

듣기 좋습니다! –

+2

특정 경우에 대한 또 다른 옵션은 MAXFLOAT를 사용하는 것입니다. – Till

3

가변 값을 사용하여 설정되지 않은 상태를 나타내면 변수가 해당 상수 값을 합법적으로 얻으면 종종 오류가 발생합니다.

NSNumber을 사용하여 플로트를 저장하는 것이 좋습니다. 그렇게하면 nil 일뿐만 아니라 그 상태로 기본 설정됩니다.

소수의 수레 만 필요하다고 가정합니다. 수백만 개가 필요하면 NSNumber이 너무 느리고 메모리가 많이 필요할 수 있습니다.

+0

이 수레로 수학을해야하므로 NSNumber는 이상적이지 않습니다. 일시적으로 변환 할 수 있다고 생각하지만 비싸고 불필요한 것 같습니다. NaN과 같은 것을 사용하는 것의 위험성을 확대 할 수 있습니까? – Nathan

+0

위험은 부동 소수점이 할당되었지만 NaN 값을 보유하여 코드에서 할당되지 않은 것으로 처리 할 수있는 경우입니다. 물론, 어쨌든 맹목적으로 NaN을 대부분의 수학 루틴에 전달해서는 안됩니다. 이 값이 사용자로부터 나온 것이라면 입력 결과가 NaN이되었을 때 다시 입력하도록 알려주는 것도 논리적입니다. – Dondragmer

2

이러한 float 속성을 오버로드하는 대신 (X 및 Y라고 부름) 각 속성에 대해 별도의 isValid 플래그를 만듭니다. 부동 소수점이 설정되지 않았 음을 나타내도록 플래그를 초기화하고 플래그를 적절하게 관리하기위한 자체 setter를 제공하십시오. 당신은 실제로 한 단계 더 가서 X는 반대의 경우도 마찬가지 Y를 할당에 대한 세터를 가질 수

if (self.isXValid == YES) { 
    self.Y = ... // assigning to Y sets isYValid to YES 
} 
else if (self.isYValid == YES) { 
    self.X = ... // assigning to Y sets isXValid to YES 
} 

: 그래서 당신의 코드가 같을 수 있습니다. 또는 X와 Y가 너무 가깝게 연결되어있어 다른 변수의 값을 기반으로 계산할 수 있다면 실제로 두 속성에 대해 하나의 변수 만 필요합니다.