2012-04-17 28 views
6

0 değeri olan bir floattan bir float float verildiğinde farklı bir şey yapması gereken bir yönteme sahibim. Temel olarak, bir değişkenin olup olmadığını kontrol etmem gerek. 0.Bir unset float ve bir 0 değeri ile nasıl ayırt edebilirim?

Yani

, I değişken ayarlanmazsa eğer (nil, NULL, NO, vb) ve nasıl değeri 0 için de geçerlidir dönmeden görmek için test edebilirsiniz unset bir değer olarak neyi tutucu kullanmalısınız ?

+0

Neden NaN (demek, 1.0/0.0)? Bir yüzüğün NaN olup olmadığını test etmek için, bu sadece bir "num" = num '(NaN, hatta bir şeyle eşit değildir). – cHao

+0

Sıfırlama ile NaN'nin sıfıra getirilmesi tehlikelidir, çünkü bir sinyalleme tuzağı yaratabilir/oluşturabilir NaN –

+0

Daha iyi bir yol var mı? NaN'leri, * kasıtlı olarak * nasıl üretecekleri konusunda endişelenecek kadar aldatmadım. :) Oldukça emin 'NaN' bir float literal olarak işe yaramaz ... – cHao

cevap

16

Sen (örn nan() veya nanf() arayarak) NaN için yüzen başlatmak ve bir dizi tutmak için değiştirilip değiştirilmediğini sonra isnan() ile test edebilirsiniz. (myvalue == nan() will değil işi o test unutmayın.)

Bu, hem oldukça basittir (muhtemelen her durumda math.h içerecektir) ve kavramsal mantıklı: bir sayıya ayarlı değil herhangi bir değer "sayı değil" dir ...

+5

Harika, teşekkürler! CGFloat myFloat = NAN ve 'if (isnan (myFloat)) {...}' ile çalıştım. – Nathan

+0

Bunu duymak güzel! –

+2

Özel durumunuz için başka bir seçenek de MAXFLOAT kullanıyor olabilir. – Till

3

Değişmeyen durumu belirtmek için sabit bir değer kullanmak, genellikle bu değişkenin değerini sabit olarak aldığında hatalara neden olur.

Floatınızı saklamak için NSNumber kullanmayı düşünün. Bu şekilde sadece nil olamaz, bu duruma varsayılan olacaktır.

Bu, yalnızca az sayıda yüzeye ihtiyaç duyduğunuzu varsayar. Milyonlarca kullanıcıya ihtiyacınız varsa, NSNumber çok yavaş ve yoğun bellek kullanıyor olabilir.

+0

Bu şamandıralarla matematik yapmam gerekiyor, bu yüzden NSNumber ideal değil. Sanırım geçici olarak dönüşebiliyordum ama bu pahalı ve gereksiz görünüyor. NaN gibi bir şey kullanmanın tehlikeleri üzerinde büyüyebilir misin? – Nathan

+0

Tehlike, float'ınızın atanmış olmasına rağmen, NaN değerini tutması, kodunuzun atanmamış olarak davranmasıdır. Tabii ki, NaN'i bir şekilde çoğu matematik rutinine körü körüne aktarmamalısınız. Bu değerler kullanıcıdan geliyorsa, girdilerinin NaN ile sonuçlandığı zaman yeniden yazılmalarını söyleme de mantıklıdır. – Dondragmer

2

Bu float özelliklerinin aşırı yüklenmesi yerine (bunlara X ve Y adını verelim), her özellik için ayrı bir isValid bayrağı oluşturun. Şamandıraların ayarlanmadığını belirtmek için bayrakları yeniden başlatın ve bayrakların uygun şekilde yönetilmesi için kendi ayarlayıcılarınızı sağlayın. Aslında bir adım daha ileri gidip X'in de tersi Y atamak ve için ayarlayıcı olabilir

if (self.isXValid == YES) { 
    self.Y = ... // assigning to Y sets isYValid to YES 
} 
else if (self.isYValid == YES) { 
    self.X = ... // assigning to Y sets isXValid to YES 
} 

: Yani kod aşağıdaki gibi görünebilir. Ya da, X ve Y birbirine çok yakın bağlanmışsa, diğerinin değerine dayanarak hesaplayabilirsiniz, her iki özellik için de sadece bir değişkene ihtiyacınız vardır.