ObjC中nan和相似值的含义

时间:2013-06-02 02:41:52

标签: objective-c floating-point nan null

我在某些代码中遇到了nan值,我知道如何处理它,但在尝试解释nan的含义时,我意识到自己并不确定。对于我想要澄清的事情,还有一些类似的奇怪值。

inf这显然意味着无穷大,但是当你达到最大浮动值时会出现这种情况吗?

nan这究竟是什么意思,什么时候弹出这个值?

nil我想我确实知道这个。尚未分配的对象的实例。我认为无论如何它都属于这个列表。

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

2 个答案:

答案 0 :(得分:11)

  

inf这显然意味着无穷大,但是当你达到最大浮动值时会出现这种情况吗?

这不是ObjC的一部分,除了NSNumber在保持无限值时将其用作-description

NSNumber内的实际值是double,由C-定义,实际上,定义主要取决于平台。但是,在大多数平台上,它是IEEE-754 binary64。 IEEE 754标准定义了affinely extended real number line,具有正无穷大和负无穷大的值以及有限值。它还精确定义了有限计算可以溢出到无穷大的不同方式,以及代码如何控制它。但是,作为一般规则,是的,如果计算超过double的最大有限值,则得到正无穷大。

  

nan这究竟是什么意思,什么时候弹出这个值?

这也主要是关于C和IEEE-754,而不是ObjC(同样,除了-description的{​​{1}})。维基百科在NaN上有一个很好的页面,但是,它简单地表示“非数字”,它用于没有合理价值,甚至无穷大(或者在太多不同值之间不明确的地方)的情况,比如NSNumber

  

0/0我想我确实知道这个。尚未分配的对象的实例。我认为无论如何它都属于这个列表。

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

但是“一个尚未分配的对象”不是一个对象,并且不存在,所以...在某种程度上说首先谈论这样的事情是有道理的,我想你可以说(NSObject *)0是指向它的指针。

  

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

nil值用作实际存在的占位符对象,但代表什么都没有,在一个你实际上根本没有任何东西的地方(例如,在{ {1}})。

如果您尝试将空指针打印为C字符串(例如+[NSNull null]),您可能还会看到NSArray。但是你看到的任何代码实际上都不是合法的C或ObjC代码。

此外,人们常常将nullNSLog(@"%s", 0)混淆,这意味着任何空指针。

因此,如果您有nullNULLid等,并且您没有任何要指向的内容,请使用NSObject *。当您有一个指向非ObjC值的指针(如NSSomeOtherClass *),并且您没有指向它的任何内容时,请使用nil。如果要将空指针放入集合中,请使用int *

答案 1 :(得分:2)

NaN表示“不是数字”。

当没有一个合理的数字时,浮点运算会产生NaN。例如,没有sqrt(–1)可以返回的浮点数,这将是-1的平方根的良好近似值。

NaNs可用于各种事物。软件可以初始化浮点对象以发信号通知NaN,因此使用一个而不首先为其分配值会导致陷阱。

可以静默忽略安静的NaN,以允许完成大量计算,并在以后修复或删除NaN。 (大多数操作传播NaN:如果添加NaN和数字,结果是NaN。)