ObjC中nan和类似的值的含义是什么?

3
我在我的代码中遇到了nan值,我知道如何处理它,但是当我试图解释nan到底意味着什么时,我意识到我自己也不确定。还有一些类似的奇怪值,我想要一些澄清。 inf 显然表示无穷大,但是当你达到最大浮点值时会出现吗? nan 这到底意味着什么,什么时候会出现这个值? nil 我认为我知道这一个。未分配对象的实例。我认为它也应该属于这个列表。 null 我不确定这一个,但我认为它和nil相似?
2个回答

12

inf 显然代表正无穷,但在达到最大浮点值时是否会出现?

这并不是 ObjC 的一部分,除非 NSNumber 在持有无限值时使用此作为 -description

NSNumber 内部的实际值是一个 double,由 C 定义 - 实际上,定义在很大程度上取决于平台。但是,在大多数平台上,它是一个 IEEE-754 binary64。 IEEE 754 标准定义了一个仿射扩展实数线,其中包括正负无穷大以及有限值。它还精确定义了有限计算如何溢出到无限大,以及您的代码如何控制它。但是,总的来说,如果计算超过了 double 的最大有限值,则得到正无穷。

nan 这具体意味着什么,这个值什么时候会出现?

这同样主要涉及 C 和 IEEE-754,而不是 ObjC(再次除了 NSNumber-description)。维基百科有一个关于 NaN的好页面,但简而言之,它表示“非数字”,用于没有明智的值甚至不是无穷大的情况(或者其间存在多个不同的值),比如 0/0

nil 我认为我知道这个。未分配对象的实例。我认为它仍然属于这个列表。

nil不是一个对象的实例,它是一个空指针,在没有实例需要指向时使用。它基本上相当于(id)0(NSObject *)0

但是"未分配对象"也不是一个对象,不存在,因此……在第一次谈论这样的事情有任何意义的范围内,我想你可以说nil是它的指针。

  

null 我对这个不确定,但我认为它与nil类似?

+ [NSNull null] 值用作实际存在但代表什么都没有的占位符对象,放在无法没有任何东西的地方(例如,在NSArray中)。

如果尝试将空指针打印为C字符串(例如,NSLog(@"%s",0)),则还可能看到null。 但是,任何出现此代码的代码实际上都不是合法的C或ObjC代码。

此外,人们经常混淆nullNULL,后者表示任何空指针。

因此,当您拥有idNSObject *NSSomeOtherClass *等指针,并且没有任何东西需要指向时,请使用nil。当您拥有对非ObjC值的指针,例如int *,并且没有任何东西需要指向时,请使用NULL。当您想将空指针放入集合中时,请使用null


2

NaN代表“不是一个数字”。

当浮点运算没有合理的结果时,会产生NaN。例如,没有一个浮点数可以作为对-1的平方根的良好近似值。

NaN可以用于各种用途。软件可以将浮点对象初始化为信号NaN,这样在未给其赋值之前使用它会导致陷阱。

静默NaN可以被忽略,以允许大型计算完成,并在稍后修复或删除NaN(大多数操作传播NaN:如果你将NaN和数字相加,则结果为NaN)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接