Determina se NSNumber è NaN

Come posso determinare se un numero NSN di Cocoa rappresenta NaN (non un numero)?

Ciò emerge, ad esempio, quando analizzo una stringa con contenuti non numerici non validi.

Quindi, ho scoperto che la proprietà di class [NSDecimalNumber notANumber] è solo per questo scopo. In alcune lingue NaN! = NaN, ma questo non è il caso di Cocoa.

Come dice Mike Abdullah, il modo naturale per rappresentare un NaN in Cocoa è con nil , ma [NSNumber numberWithDouble:NAN] restituisce un object valido. Non esiste un modo specifico NSNumber per rilevare questo, ma il modo generale, isnan([foo doubleValue]) , funziona. Se non ti piacciono le funzioni, puoi inserirle in una categoria.

Per i decimali, almeno:

 [[NSDecimalNumber notANumber] isEqualToNumber:myNumber] 

Per determinare se NSNumber è un NaN, convertirlo in doppio e utilizzare la funzione C isnan() :

 NSNumber *validNumber = [NSNumber numberWithDouble: 1.]; NSLog( @"%d", isnan(validNumber.doubleValue) ); // prints "0" NSNumber *nanNumber = [NSNumber numberWithDouble: 0./0.]; NSLog( @"%d", isnan(nanNumber.doubleValue) ); // prints "1" 

Tuttavia, dovresti fare attenzione, perché ci sono altri valori speciali, ad esempio:

 NSNumber *posInfinity = [NSNumber numberWithDouble: 1./0.]; NSLog( @"%d", isnan(posInfinity.doubleValue) ); // prints "0" 

Se si desidera verificare anche questi valori, è preferibile utilizzare isnormal() :

 NSLog( @"%d", isnormal(validNumber.doubleValue) ); // prints "1" NSLog( @"%d", isnormal(nanNumber.doubleValue) ); // prints "0" NSLog( @"%d", isnormal(posInfinity.doubleValue) ); // prints "0" 

Ho scoperto che funziona, ma è legale?

 NSNumber *NaN = [NSDecimalNumber notANumber]; NSDecimalNumber *x = ... fill it somehow with NaN content ... if ( x == NaN ) ... this works 

è NaN garantito essere un valore costante singleton ? Sarebbe bello, ma suppongo che non lo sia, dal momento che tutti gli esempi che ho trovato usano i metodi isEqual .

c’è anche la funzione isnan () l’ho trovata oggi.

Possiamo anche usare un #define definito in math.h come follws

 if(isnan(myNumber)) { // myNumber is NaN . 

}

Qualsiasi espressione booleana con NaN restituirà sempre false. Ma come è utile?

Ricevo Nan da posizioneInView: mentre gestivo alcuni gesti in un’app per iPhone. Ed è stato molto contento di scoprire che qualsiasi espressione booleana con NaN restituirà sempre false. Metto questo per usare liek qui sotto:

// Stavo usando UIPanGestureRecognizer , e sembra che su TouchUp avrei ottenuto Nan per il / location .x – .y – abbastanza ragionevole dal momento che in questo caso la fine di un touch non ha una posizione.

 CGPoint location = [gestureRecognizer locationInView:self]; if ( location.x != location.x || location.y != location.y ) { return; } 

Quindi, a lungo .x e .y o valori float legittimi, ovviamente non saranno mai uguali al proprio valore. MA nel caso di .x o .y essendo NaN, il confronto sarà falso. E posso tranquillamente evitare i calcoli con Nan.

Non esiste un vero object per NSNumber poiché se non è un numero, allora, beh, non è un NSNumber. È più usuale usare un object nullo per rappresentarlo.