2012-04-17 21 views
6

私は、浮動小数点数が浮動小数点数の0より大きい場合、別のことをする必要があるメソッドを持っています。基本的には、変数があるかどうかをチェックする必要があります。 0未設定の浮動小数点と値が0の浮動小数点を区別するにはどうすればよいですか?

のだから、はどのようなプレースホルダ私が未設定の値(ゼロ、NULL、NO、など)、および変数が0の値をtrueを返すことなく、設定されていないかどうかを確認するためにテストすることができますどのようにとして使用する必要があります?

+0

なぜNaN(1.0/0.0など)を使用しないのですか?浮動小数点数がNaNかどうかをテストするには、それはちょうど 'num!= num'(NaNはそれ自身でさえ、何にも等しくない)です。 – cHao

+0

0で除算してNaNを取得すると、シグナリングNaNをトラップ/生成する可能性があるため、危険です。 –

+0

より良い方法はありますか? *意図的に*生成する方法を心配するほどNaNを混乱させていません。 :)確かに 'NaN'は浮動小数点型のリテラルとしては機能しません... – cHao

答えて

16

あなたは(例えばnan()またはnanf()を呼び出すことによって)NaNにあなたの山車を初期化し、その後、彼らは数を保持するために変更された場合isnan()でテストすることができます。 (。myvalue == nan()ない動作するテストのことに注意してください)

これはかなり単純な(おそらくどのような場合にmath.hが含まれます)と概念的に賢明な両方である:数に設定されていない任意の値が「数でない」です...

+5

素晴らしいです、ありがとうございます! 'CGFloat myFloat = NAN;'と 'if(isnan(myFloat)){...}'を使って作業しました。 – Nathan

+0

聞いてよかったです! –

+2

特定のケースの別のオプションは、MAXFLOATを使用することです。 – Till

3

未定義状態を示すために定数値を使用すると、変数が正当にその定数の値を取得したときにエラーになることがよくあります。

NSNumberを使用してフロートを保管することを検討してください。そうすれば、それはnilだけでなく、その状態にデフォルト設定されます。

これは、少数の浮動小数点だけが必要であることを前提としています。何百万ものものが必要な場合は、NSNumberが遅すぎることがあります。

+0

私はこれらの浮動小数点数で数学を行う必要があるので、NSNumberは理想的ではありません。私は一時的に変換することができますが、それは高価で不要なようです。あなたはNaNのようなものを使うことの危険性を拡大できますか? – Nathan

+0

浮動小数点数が割り当てられてNaNの値を保持することがあるため、コードで未割り当てとして処理される可能性があります。もちろん、とにかくNaNをほとんどの数学ルーチンに盲目的に渡すべきではありません。これらの値がユーザーから来た場合、入力がNaNになったときに再入力するように指示することも論理的です。 – Dondragmer

2

これらのプロパティをオーバーロードする代わりに(それぞれXとYと呼ぶ)、プロパティごとに別々のisValidフラグを作成します。浮動小数点数が設定されていないことを示すためにフラグを初期化し、フラグを適切に管理するための独自のセッターを用意します。したがって、コードは次のようになります。

実際にはさらに進んでXのセッターにもYを割り当て、逆も同様です。あるいは、XとYが密接にリンクしていて、他の値に基づいてXとYを計算できる場合は、実際には両方のプロパティに対して1つの変数しか必要としません。

関連する問題