确定NSNumber是否是NaN

我如何确定一个cocoaNSNumber是否代表NaN(不是数字)?

例如,当我分析一个包含无效(非数字)内容的string时,就会出现这种情况。

所以,我发现类属性[NSDecimalNumber notANumber]就是为了这个目的。 在某些语言中,NaN!= NaN,但cocoa并不是这种情况。

正如Mike Abdullah所说,在cocoa中表示NaN的自然方法是nil ,但[NSNumber numberWithDouble:NAN]确实返回一个有效的对象。 没有NSNumber特定的方法来检测这个,但一般的方法, isnan([foo doubleValue]) ,工作。 如果你不喜欢function,你可以把它放在一个类别中。

对于小数,至less:

 [[NSDecimalNumber notANumber] isEqualToNumber:myNumber] 

要确定NSNumber是否是NaN,请将其转换为double并使用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" 

但是,您应该小心,因为还有其他特殊的值,例如:

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

如果你想检查这些值,最好使用isnormal()来代替:

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

我发现这有效,但这是合法的吗?

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

NaN保证是一个singleton常数? 会很酷,但我想这不是,因为我发现所有的例子使用isEqual方法。

还有functionisnan()我今天发现它。

我们也可以使用在math.h中定义的#define作为follws

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

}

使用NaN的任何布尔expression式将始终返回false。 但是这有用吗?

我正在从locationInView获取Nan:在iPhone应用程序中处理一些手势。 我们非常高兴地发现,任何带有NaN的布尔expression式都会返回false。 我把这个用在下面:

//我正在使用UIPanGestureRecognizer ,看起来在TouchUp上我会得到Nan的位置.x – .y – 非常合理,因为在这种情况下,触摸的结尾没有位置。

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

那么只要.x和.y或合法的浮动价值,它们当然永远不会有自己的价值。 但在.x或.y是NaN的情况下,比较将是错误的。 我可以安全地避免与Nan的计算。

对于NSNumber来说,并不存在这样一个对象,因为如果它不是一个数字,那么它就不是一个NSNumber。 使用零对象来表示这种情况更为常见。