Determine se NSNumber é NaN

Como posso determinar se um NSN de cacau representa NaN (não um número)?

Isso surge, por exemplo, quando eu analiso uma string que tem um conteúdo inválido (não numérico).

Então, descobri que a propriedade de class [NSDecimalNumber notANumber] é apenas para essa finalidade. Em algumas línguas NaN! = NaN, mas este não é o caso em Cocoa.

Como diz Mike Abdullah, a maneira natural de representar um NaN no Cocoa é com nil , mas [NSNumber numberWithDouble:NAN] retorna um object válido. Não existe uma maneira específica de NSNumber de detectar isso, mas a maneira geral, isnan([foo doubleValue]) , funciona. Se você não gosta de funções, pode colocá-las em uma categoria.

Para decimais, pelo menos:

 [[NSDecimalNumber notANumber] isEqualToNumber:myNumber] 

Para determinar se NSNumber é NaN, converta-o em double e use a function 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" 

No entanto, você deve ter cuidado, porque existem outros valores especiais, por exemplo:

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

Se você quiser verificar esses valores também, é melhor usar isnormal() :

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

Eu achei que isso funciona, mas é legal?

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

NaN é garantido para ser um valor constante singleton ? Seria legal, mas suponho que não, já que todos os exemplos que encontrei usam os methods isEqual .

existe também a function isnan () que encontrei hoje.

Nós também podemos usar um #define definido em math.h como follws

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

}

Qualquer expressão booleana com NaN sempre retornará false. Mas como isso é útil?

Eu estava pegando Nan de volta do locationInView: enquanto gerenciava alguns gestos em um aplicativo para iPhone. E ficou muito satisfeito ao descobrir que qualquer expressão booleana com NaN sempre retornará false. Eu coloquei isso para usar o liek abaixo:

// Eu estava usando o UIPanGestureRecognizer , e parece que no TouchUp eu UIPanGestureRecognizer Nan para a localização / .x – .y – bastante razoável, pois nesse caso o final de um toque não tem um local.

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

Então, por tanto tempo .xe .y ou valores de flutuação legítimos, é claro que eles nunca serão iguais a seu próprio valor. MAS, no caso de .x ou .y ser NaN, a comparação será falsa. E eu posso evitar com segurança cálculos com Nan.

Não existe realmente um object desse tipo para o NSNumber, pois se não for um número, então, bem, não é um NSNumber. É mais comum usar um object nulo para representar isso.