2012-04-17 95 views
6

我有一个方法需要做一个不同的事情,当给定一个未设置的浮动比值为0的浮动。基本上,我需要检查一个变量是否已被计算,如果它有一个值设置0如何区分未设置的浮点数和值为0的浮点数?

所以,我应该用什么作为占位一个没有设置(NIL,NULL,NO等)和如何测试,看是否有变量没有设置不为0的值返回true ?

+0

为什么不是NaN(比如1.0/0.0)?要测试一个浮点数是否为NaN,它就是'num!= num'(NaN不等于任何东西,甚至本身)。 – cHao 2012-04-17 02:23:42

+0

通过除零来获取NaN是危险的,因为它可能会陷入/产生信号NaN – 2012-04-17 02:31:39

+0

有没有更好的方法?我没有足够担心如何*故意*生成它们。 :)很确定'NaN'不会像浮动文字那样工作...... – cHao 2012-04-17 02:32:20

回答

16

就可以初始化你花车为NaN(例如通过调用nan()nanf()),然后用isnan()测试,如果他们已改为举办一些。 (请注意,测试myvalue == nan()工作。)

这是两个非常简单(你可能会包括math.h在任何情况下),并且在概念明智:未设置为数字的值是“非数字” ...

+5

太棒了,谢谢!我使用'CGFloat myFloat = NAN;'和'if(isnan(myFloat)){...}'工作。 – Nathan 2012-04-17 02:36:52

+0

很高兴听到! – 2012-04-17 02:38:47

+2

您的特定情况的另一种选择是使用MAXFLOAT。 – Till 2012-04-17 02:42:40

3

当变量合法地获得该常数的值时,使用常数值指示未设置状态通常会导致错误。

考虑使用NSNumber来存储你的浮点数。这样它不仅可以是nil,它将默认为该状态。

这假定你只需要少量的花车。如果您需要上百万个,那么NSNumber可能太慢并且需要大量内存。

+0

我需要用这些浮标做数学运算,所以NSNumber并不理想。我想我可以暂时转换,但这似乎很昂贵和不必要。您能否扩展使用NaN之类的危险? – Nathan 2012-04-17 02:35:19

+0

危险是如果您的浮动可能最终分配,但保存值NaN,以便您的代码将其视为未分配。当然,无论如何,你都不应该盲目地将NaN传递给大多数的数学例程。如果这些值来自用户,告诉他们在输入NaN时重新输入也是合乎逻辑的。 – Dondragmer 2012-04-17 02:43:37

2

而不是重载这些float属性(我们称之为X和Y),为每个属性创建一个单独的isValid标志。初始化标志以指示浮点数尚未设置,并提供您自己的setter来适当地管理标志。所以,你的代码可能看起来像:

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 
} 

其实你可以走了一步,有setter方法X还指派Y和反之亦然。或者,如果X和Y紧密联系以便可以基于另一个的值计算一个值,那么对于这两个属性实际上只需要一个变量。