确定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。 使用零对象来表示这种情况更为常见。