NSNumber
Cocoaが NaN (数値ではない) を表しているかどうかを判断するにはどうすればよいですか?
これは、たとえば、無効な (数値以外の) 内容を含む文字列を解析すると発生します。
NSNumber
Cocoaが NaN (数値ではない) を表しているかどうかを判断するにはどうすればよいですか?
これは、たとえば、無効な (数値以外の) 内容を含む文字列を解析すると発生します。
[NSDecimalNumber notANumber]
それで、クラスプロパティはこの目的のためだけのものであることがわかりました。一部の言語では NaN != NaN ですが、Cocoa ではそうではありません。
Mike Abdullah が言うように、Cocoa で NaN を表現する自然な方法は withですnil
が[NSNumber numberWithDouble:NAN]
、有効なオブジェクトを返します。NSNumber
これを検出する固有の方法はありませんが、一般的な方法でisnan([foo doubleValue])
ある が機能します。機能が気に入らない場合は、カテゴリに貼り付けることができます。
小数の場合、少なくとも:
[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]
NSNumberがNaNであるかどうかを判断するには、NSNumberを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 を返します。しかし、それはどのように役立ちますか?
私は locationInView: から Nan を取得していましたが、iPhone アプリでいくつかのジェスチャーを処理していました。そして、NaN を含むブール式は常に false を返すことがわかり、とてもうれしく思いました。私はこれを以下のように使用します:
//私は を使用していました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 を使用した計算を安全に回避できます。
NSNumber が数値でない場合、NSNumber ではないため、実際にはそのようなオブジェクトはありません。これを表すために nil オブジェクトを使用する方がより一般的です。