Cocoa NSNumberがNaN(数値ではない)を表しているかどうかを確認するにはどうすればよいですか?
これは、たとえば、無効な(数値ではない)内容を含む文字列を解析すると発生します。
だから、私はクラスのプロパティ[NSDecimalNumber notANumber]
はこの目的のためだけです。一部の言語ではNaN!= NaNですが、Cocoaではそうではありません。
Mike Abdullahが言うように、CocoaでNaNを表す自然な方法はnil
を使用することですが、_[NSNumber numberWithDouble:NAN]
_は有効なオブジェクトを返します。これを検出するNSNumber
固有の方法はありませんが、一般的な方法であるisnan([foo doubleValue])
が機能します。関数が気に入らない場合は、カテゴリに固定できます。
小数の場合、少なくとも:
[[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
メソッドを使用しているため、そうではないと思います。
isnan()関数もあります。今日見つけました。
Math.hで定義された#defineを次のように使用することもできます
if(isnan(myNumber))
{ // myNumber is NaN .
}
NaNのブール式は常にfalseを返します。しかし、それはどのように役立ちますか?
IPhoneアプリでいくつかのジェスチャーを処理しているときに、locationInViewからNanを取り戻していました。また、NaNを使用したブール式は常にfalseを返すことを知って非常に嬉しく思いました。私はこれを下のliekを使うために置きました:
// UIPanGestureRecognizer
を使用していて、TouchUpでは/ location .x-.yのNanを取得するようです。この場合、タッチの終わりに場所がないためです。
CGPoint location = [gestureRecognizer locationInView:self];
if ( location.x != location.x || location.y != location.y )
{
return;
}
したがって、.xおよび.yまたは正当なfloat値である限り、もちろん、それらが独自の値と等しくなることは決してありません。ただし、.xまたは.yがNaNの場合、比較はfalseになります。そして、Nanでの計算を安全に回避できます。