web-dev-qa-db-ja.com

NSNumberがNaNかどうかを判別

Cocoa NSNumberがNaN(数値ではない)を表しているかどうかを確認するにはどうすればよいですか?

これは、たとえば、無効な(数値ではない)内容を含む文字列を解析すると発生します。

44
Adam Ernst

だから、私はクラスのプロパティ[NSDecimalNumber notANumber]はこの目的のためだけです。一部の言語ではNaN!= NaNですが、Cocoaではそうではありません。

66
Adam Ernst

Mike Abdullahが言うように、CocoaでNaNを表す自然な方法はnilを使用することですが、_[NSNumber numberWithDouble:NAN]_は有効なオブジェクトを返します。これを検出するNSNumber固有の方法はありませんが、一般的な方法であるisnan([foo doubleValue])が機能します。関数が気に入らない場合は、カテゴリに固定できます。

17
Jens Ayton

小数の場合、少なくとも:

[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]
12
Peter DeWeese

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"
_
10
Jakob Egger

これは機能することがわかりましたが、合法ですか?

NSNumber *NaN = [NSDecimalNumber notANumber];

NSDecimalNumber *x = ... fill it somehow with NaN content ...

if ( x == NaN ) ... this works

NaNsingleton定数値であることが保証されていますか?かっこいいと思いますが、私が見つけたすべての例ではisEqualメソッドを使用しているため、そうではないと思います。

9
Thomas

isnan()関数もあります。今日見つけました。

5
Johnny Mast

Math.hで定義された#defineを次のように使用することもできます

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

}

2
Mak083

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での計算を安全に回避できます。

0
Alan Morford